Loading libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java +12 −9 Original line number Diff line number Diff line Loading @@ -1418,7 +1418,7 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen if (splitRule instanceof SplitPairRule && ((SplitPairRule) splitRule).shouldClearTop()) { removeExistingSecondaryContainers(wct, primaryContainer); } primaryContainer.getTaskContainer().mSplitContainers.add(splitContainer); primaryContainer.getTaskContainer().addSplitContainer(splitContainer); } /** Cleanups all the dependencies when the TaskFragment is entering PIP. */ Loading @@ -1430,8 +1430,9 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen return; } final List<SplitContainer> splitsToRemove = new ArrayList<>(); final List<SplitContainer> splitContainers = taskContainer.getSplitContainers(); final Set<TaskFragmentContainer> containersToUpdate = new ArraySet<>(); for (SplitContainer splitContainer : taskContainer.mSplitContainers) { for (SplitContainer splitContainer : splitContainers) { if (splitContainer.getPrimaryContainer() != container && splitContainer.getSecondaryContainer() != container) { continue; Loading @@ -1449,7 +1450,7 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen } } container.resetDependencies(); taskContainer.mSplitContainers.removeAll(splitsToRemove); taskContainer.removeSplitContainers(splitsToRemove); // If there is any TaskFragment split with the PIP TaskFragment, update their presentations // since the split is dismissed. // We don't want to close any of them even if they are dependencies of the PIP TaskFragment. Loading Loading @@ -1481,7 +1482,8 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen // Cleanup any split references. 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)) { // Don't need to check because it has been in the remove list. continue; Loading @@ -1492,7 +1494,7 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen containersToRemove.add(splitContainer); } } taskContainer.mSplitContainers.removeAll(containersToRemove); taskContainer.removeSplitContainers(containersToRemove); // Cleanup any dependent references. for (TaskFragmentContainer containerToUpdate : taskContainer.mContainers) { Loading Loading @@ -1629,7 +1631,7 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen /** Whether the given split is the topmost split in the Task. */ private boolean isTopMostSplit(@NonNull SplitContainer splitContainer) { final List<SplitContainer> splitContainers = splitContainer.getPrimaryContainer() .getTaskContainer().mSplitContainers; .getTaskContainer().getSplitContainers(); return splitContainer == splitContainers.get(splitContainers.size() - 1); } Loading @@ -1641,7 +1643,8 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen if (container == null) { return null; } final List<SplitContainer> splitContainers = container.getTaskContainer().mSplitContainers; final List<SplitContainer> splitContainers = container.getTaskContainer().getSplitContainers(); if (splitContainers.isEmpty()) { return null; } Loading @@ -1665,7 +1668,7 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen @NonNull TaskFragmentContainer firstContainer, @NonNull TaskFragmentContainer secondContainer) { final List<SplitContainer> splitContainers = firstContainer.getTaskContainer() .mSplitContainers; .getSplitContainers(); for (int i = splitContainers.size() - 1; i >= 0; i--) { final SplitContainer splitContainer = splitContainers.get(i); final TaskFragmentContainer primary = splitContainer.getPrimaryContainer(); Loading Loading @@ -1945,7 +1948,7 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen @GuardedBy("mLock") SplitContainer getSplitContainer(@NonNull IBinder token) { 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) { if (container.getToken().equals(token)) { return container; Loading libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskContainer.java +14 −1 Original line number Diff line number Diff line Loading @@ -55,7 +55,7 @@ class TaskContainer { /** Active split pairs in this Task. */ @NonNull final List<SplitContainer> mSplitContainers = new ArrayList<>(); private final List<SplitContainer> mSplitContainers = new ArrayList<>(); @NonNull private final Configuration mConfiguration; Loading Loading @@ -207,6 +207,19 @@ class TaskContainer { 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}. */ void getSplitStates(@NonNull List<SplitInfo> outSplitStates) { for (SplitContainer container : mSplitContainers) { Loading libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/SplitControllerTest.java +9 −7 Original line number Diff line number Diff line Loading @@ -320,11 +320,11 @@ public class SplitControllerTest { doReturn(tf).when(splitContainer).getSecondaryContainer(); doReturn(createTestTaskContainer()).when(splitContainer).getTaskContainer(); doReturn(createSplitRule(mActivity, mActivity)).when(splitContainer).getSplitRule(); final List<SplitContainer> splitContainers = mSplitController.getTaskContainer(TASK_ID).mSplitContainers; splitContainers.add(splitContainer); final TaskContainer taskContainer = mSplitController.getTaskContainer(TASK_ID); taskContainer.addSplitContainer(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); Loading @@ -332,7 +332,9 @@ public class SplitControllerTest { // Verify if one or both containers in the top SplitContainer are finished, // 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(); mSplitController.updateContainer(mTransaction, tf); Loading Loading @@ -377,7 +379,7 @@ public class SplitControllerTest { doReturn(true).when(taskContainer).isVisible(); mSplitController.updateContainer(mTransaction, taskFragmentContainer); verify(mSplitPresenter).updateSplitContainer(taskContainer.mSplitContainers.get(0), verify(mSplitPresenter).updateSplitContainer(taskContainer.getSplitContainers().get(0), mTransaction); } Loading Loading @@ -1091,7 +1093,7 @@ public class SplitControllerTest { verify(mTransaction).finishActivity(secondaryActivity0.getActivityToken()); verify(mTransaction).finishActivity(secondaryActivity1.getActivityToken()); assertTrue(taskContainer.mContainers.isEmpty()); assertTrue(taskContainer.mSplitContainers.isEmpty()); assertTrue(taskContainer.getSplitContainers().isEmpty()); } @Test Loading Loading
libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java +12 −9 Original line number Diff line number Diff line Loading @@ -1418,7 +1418,7 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen if (splitRule instanceof SplitPairRule && ((SplitPairRule) splitRule).shouldClearTop()) { removeExistingSecondaryContainers(wct, primaryContainer); } primaryContainer.getTaskContainer().mSplitContainers.add(splitContainer); primaryContainer.getTaskContainer().addSplitContainer(splitContainer); } /** Cleanups all the dependencies when the TaskFragment is entering PIP. */ Loading @@ -1430,8 +1430,9 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen return; } final List<SplitContainer> splitsToRemove = new ArrayList<>(); final List<SplitContainer> splitContainers = taskContainer.getSplitContainers(); final Set<TaskFragmentContainer> containersToUpdate = new ArraySet<>(); for (SplitContainer splitContainer : taskContainer.mSplitContainers) { for (SplitContainer splitContainer : splitContainers) { if (splitContainer.getPrimaryContainer() != container && splitContainer.getSecondaryContainer() != container) { continue; Loading @@ -1449,7 +1450,7 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen } } container.resetDependencies(); taskContainer.mSplitContainers.removeAll(splitsToRemove); taskContainer.removeSplitContainers(splitsToRemove); // If there is any TaskFragment split with the PIP TaskFragment, update their presentations // since the split is dismissed. // We don't want to close any of them even if they are dependencies of the PIP TaskFragment. Loading Loading @@ -1481,7 +1482,8 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen // Cleanup any split references. 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)) { // Don't need to check because it has been in the remove list. continue; Loading @@ -1492,7 +1494,7 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen containersToRemove.add(splitContainer); } } taskContainer.mSplitContainers.removeAll(containersToRemove); taskContainer.removeSplitContainers(containersToRemove); // Cleanup any dependent references. for (TaskFragmentContainer containerToUpdate : taskContainer.mContainers) { Loading Loading @@ -1629,7 +1631,7 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen /** Whether the given split is the topmost split in the Task. */ private boolean isTopMostSplit(@NonNull SplitContainer splitContainer) { final List<SplitContainer> splitContainers = splitContainer.getPrimaryContainer() .getTaskContainer().mSplitContainers; .getTaskContainer().getSplitContainers(); return splitContainer == splitContainers.get(splitContainers.size() - 1); } Loading @@ -1641,7 +1643,8 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen if (container == null) { return null; } final List<SplitContainer> splitContainers = container.getTaskContainer().mSplitContainers; final List<SplitContainer> splitContainers = container.getTaskContainer().getSplitContainers(); if (splitContainers.isEmpty()) { return null; } Loading @@ -1665,7 +1668,7 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen @NonNull TaskFragmentContainer firstContainer, @NonNull TaskFragmentContainer secondContainer) { final List<SplitContainer> splitContainers = firstContainer.getTaskContainer() .mSplitContainers; .getSplitContainers(); for (int i = splitContainers.size() - 1; i >= 0; i--) { final SplitContainer splitContainer = splitContainers.get(i); final TaskFragmentContainer primary = splitContainer.getPrimaryContainer(); Loading Loading @@ -1945,7 +1948,7 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen @GuardedBy("mLock") SplitContainer getSplitContainer(@NonNull IBinder token) { 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) { if (container.getToken().equals(token)) { return container; Loading
libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskContainer.java +14 −1 Original line number Diff line number Diff line Loading @@ -55,7 +55,7 @@ class TaskContainer { /** Active split pairs in this Task. */ @NonNull final List<SplitContainer> mSplitContainers = new ArrayList<>(); private final List<SplitContainer> mSplitContainers = new ArrayList<>(); @NonNull private final Configuration mConfiguration; Loading Loading @@ -207,6 +207,19 @@ class TaskContainer { 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}. */ void getSplitStates(@NonNull List<SplitInfo> outSplitStates) { for (SplitContainer container : mSplitContainers) { Loading
libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/SplitControllerTest.java +9 −7 Original line number Diff line number Diff line Loading @@ -320,11 +320,11 @@ public class SplitControllerTest { doReturn(tf).when(splitContainer).getSecondaryContainer(); doReturn(createTestTaskContainer()).when(splitContainer).getTaskContainer(); doReturn(createSplitRule(mActivity, mActivity)).when(splitContainer).getSplitRule(); final List<SplitContainer> splitContainers = mSplitController.getTaskContainer(TASK_ID).mSplitContainers; splitContainers.add(splitContainer); final TaskContainer taskContainer = mSplitController.getTaskContainer(TASK_ID); taskContainer.addSplitContainer(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); Loading @@ -332,7 +332,9 @@ public class SplitControllerTest { // Verify if one or both containers in the top SplitContainer are finished, // 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(); mSplitController.updateContainer(mTransaction, tf); Loading Loading @@ -377,7 +379,7 @@ public class SplitControllerTest { doReturn(true).when(taskContainer).isVisible(); mSplitController.updateContainer(mTransaction, taskFragmentContainer); verify(mSplitPresenter).updateSplitContainer(taskContainer.mSplitContainers.get(0), verify(mSplitPresenter).updateSplitContainer(taskContainer.getSplitContainers().get(0), mTransaction); } Loading Loading @@ -1091,7 +1093,7 @@ public class SplitControllerTest { verify(mTransaction).finishActivity(secondaryActivity0.getActivityToken()); verify(mTransaction).finishActivity(secondaryActivity1.getActivityToken()); assertTrue(taskContainer.mContainers.isEmpty()); assertTrue(taskContainer.mSplitContainers.isEmpty()); assertTrue(taskContainer.getSplitContainers().isEmpty()); } @Test Loading