Loading libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java +22 −11 Original line number Diff line number Diff line Loading @@ -3793,6 +3793,9 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, // First, verify that we actually have opened apps in both splits. TransitionInfo.Change mainChild = null; TransitionInfo.Change sideChild = null; // Tracks the set of opening tasks in the transition final Set<Integer> openingMainTaskIds = new HashSet<>(); final Set<Integer> openingSideTaskIds = new HashSet<>(); StageTaskListener firstAppStage = null; StageTaskListener secondAppStage = null; boolean foundPausingTask = false; Loading @@ -3807,21 +3810,30 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } StageTaskListener stage = getStageOfTask(taskInfo); final @StageType int stageType = getStageType(stage); if (mainChild == null && stageType == (enableFlexibleSplit() ? STAGE_TYPE_A : STAGE_TYPE_MAIN) && (isOpeningType(change.getMode()) || change.getMode() == TRANSIT_CHANGE)) { final boolean isMainStage = stageType == (enableFlexibleSplit() ? STAGE_TYPE_A : STAGE_TYPE_MAIN); final boolean isSideStage = stageType == (enableFlexibleSplit() ? STAGE_TYPE_B : STAGE_TYPE_SIDE); final boolean isVisibleTask = isOpeningType(change.getMode()) || change.getMode() == TRANSIT_CHANGE; if (mainChild == null && isMainStage && isVisibleTask) { // Includes TRANSIT_CHANGE to cover reparenting top-most task to split. mainChild = change; firstAppStage = getStageOfTask(taskInfo); } else if (sideChild == null && stageType == (enableFlexibleSplit() ? STAGE_TYPE_B : STAGE_TYPE_SIDE) && (isOpeningType(change.getMode()) || change.getMode() == TRANSIT_CHANGE)) { } else if (sideChild == null && isSideStage && isVisibleTask) { sideChild = change; secondAppStage = stage; } else if (stageType != STAGE_TYPE_UNDEFINED && change.getMode() == TRANSIT_TO_BACK) { // Collect all to back task's and evict them when transition finished. evictWct.reparent(taskInfo.token, null /* parent */, false /* onTop */); } if (isVisibleTask) { if (isMainStage) { openingMainTaskIds.add(taskInfo.taskId); } else if (isSideStage) { openingSideTaskIds.add(taskInfo.taskId); } } } SplitScreenTransitions.EnterSession pendingEnter = mSplitTransitions.mPendingEnter; Loading Loading @@ -3897,16 +3909,14 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } if (finalMainChild != null) { if (!mainNotContainOpenTask) { finalFirstAppStage.evictOtherChildren(callbackWct, finalMainChild.getTaskInfo().taskId); finalFirstAppStage.evictOtherChildren(callbackWct, openingMainTaskIds); } else { finalFirstAppStage.evictInvisibleChildren(callbackWct); } } if (finalSideChild != null) { if (!sideNotContainOpenTask) { finalSecondAppStage.evictOtherChildren(callbackWct, finalSideChild.getTaskInfo().taskId); finalSecondAppStage.evictOtherChildren(callbackWct, openingSideTaskIds); } else { finalSecondAppStage.evictInvisibleChildren(callbackWct); } Loading Loading @@ -4008,7 +4018,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } boolean replacingMainStage = getMainStagePosition() == mSplitRequest.mActivatePosition; (replacingMainStage ? mMainStage : mSideStage).evictOtherChildren(wct, taskInfo.taskId); (replacingMainStage ? mMainStage : mSideStage).evictOtherChildren(wct, Set.of(taskInfo.taskId)); } boolean isLaunchToSplit(TaskInfo taskInfo) { Loading libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java +4 −3 Original line number Diff line number Diff line Loading @@ -62,6 +62,7 @@ import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.Set; import java.util.function.Consumer; import java.util.function.Predicate; import java.util.stream.Collectors; Loading Loading @@ -439,11 +440,11 @@ public class StageTaskListener implements ShellTaskOrganizer.TaskListener { } } void evictOtherChildren(WindowContainerTransaction wct, int taskId) { void evictOtherChildren(WindowContainerTransaction wct, Set<Integer> keepTaskIds) { for (int i = mChildrenTaskInfo.size() - 1; i >= 0; i--) { final ActivityManager.RunningTaskInfo taskInfo = mChildrenTaskInfo.valueAt(i); if (taskId == taskInfo.taskId) continue; evictChild(wct, taskInfo, "other"); if (keepTaskIds.contains(taskInfo.taskId)) continue; evictChild(wct, taskInfo, "other_" + stageTypeToString(mId)); } } Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java +22 −11 Original line number Diff line number Diff line Loading @@ -3793,6 +3793,9 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, // First, verify that we actually have opened apps in both splits. TransitionInfo.Change mainChild = null; TransitionInfo.Change sideChild = null; // Tracks the set of opening tasks in the transition final Set<Integer> openingMainTaskIds = new HashSet<>(); final Set<Integer> openingSideTaskIds = new HashSet<>(); StageTaskListener firstAppStage = null; StageTaskListener secondAppStage = null; boolean foundPausingTask = false; Loading @@ -3807,21 +3810,30 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } StageTaskListener stage = getStageOfTask(taskInfo); final @StageType int stageType = getStageType(stage); if (mainChild == null && stageType == (enableFlexibleSplit() ? STAGE_TYPE_A : STAGE_TYPE_MAIN) && (isOpeningType(change.getMode()) || change.getMode() == TRANSIT_CHANGE)) { final boolean isMainStage = stageType == (enableFlexibleSplit() ? STAGE_TYPE_A : STAGE_TYPE_MAIN); final boolean isSideStage = stageType == (enableFlexibleSplit() ? STAGE_TYPE_B : STAGE_TYPE_SIDE); final boolean isVisibleTask = isOpeningType(change.getMode()) || change.getMode() == TRANSIT_CHANGE; if (mainChild == null && isMainStage && isVisibleTask) { // Includes TRANSIT_CHANGE to cover reparenting top-most task to split. mainChild = change; firstAppStage = getStageOfTask(taskInfo); } else if (sideChild == null && stageType == (enableFlexibleSplit() ? STAGE_TYPE_B : STAGE_TYPE_SIDE) && (isOpeningType(change.getMode()) || change.getMode() == TRANSIT_CHANGE)) { } else if (sideChild == null && isSideStage && isVisibleTask) { sideChild = change; secondAppStage = stage; } else if (stageType != STAGE_TYPE_UNDEFINED && change.getMode() == TRANSIT_TO_BACK) { // Collect all to back task's and evict them when transition finished. evictWct.reparent(taskInfo.token, null /* parent */, false /* onTop */); } if (isVisibleTask) { if (isMainStage) { openingMainTaskIds.add(taskInfo.taskId); } else if (isSideStage) { openingSideTaskIds.add(taskInfo.taskId); } } } SplitScreenTransitions.EnterSession pendingEnter = mSplitTransitions.mPendingEnter; Loading Loading @@ -3897,16 +3909,14 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } if (finalMainChild != null) { if (!mainNotContainOpenTask) { finalFirstAppStage.evictOtherChildren(callbackWct, finalMainChild.getTaskInfo().taskId); finalFirstAppStage.evictOtherChildren(callbackWct, openingMainTaskIds); } else { finalFirstAppStage.evictInvisibleChildren(callbackWct); } } if (finalSideChild != null) { if (!sideNotContainOpenTask) { finalSecondAppStage.evictOtherChildren(callbackWct, finalSideChild.getTaskInfo().taskId); finalSecondAppStage.evictOtherChildren(callbackWct, openingSideTaskIds); } else { finalSecondAppStage.evictInvisibleChildren(callbackWct); } Loading Loading @@ -4008,7 +4018,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } boolean replacingMainStage = getMainStagePosition() == mSplitRequest.mActivatePosition; (replacingMainStage ? mMainStage : mSideStage).evictOtherChildren(wct, taskInfo.taskId); (replacingMainStage ? mMainStage : mSideStage).evictOtherChildren(wct, Set.of(taskInfo.taskId)); } boolean isLaunchToSplit(TaskInfo taskInfo) { Loading
libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java +4 −3 Original line number Diff line number Diff line Loading @@ -62,6 +62,7 @@ import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.Set; import java.util.function.Consumer; import java.util.function.Predicate; import java.util.stream.Collectors; Loading Loading @@ -439,11 +440,11 @@ public class StageTaskListener implements ShellTaskOrganizer.TaskListener { } } void evictOtherChildren(WindowContainerTransaction wct, int taskId) { void evictOtherChildren(WindowContainerTransaction wct, Set<Integer> keepTaskIds) { for (int i = mChildrenTaskInfo.size() - 1; i >= 0; i--) { final ActivityManager.RunningTaskInfo taskInfo = mChildrenTaskInfo.valueAt(i); if (taskId == taskInfo.taskId) continue; evictChild(wct, taskInfo, "other"); if (keepTaskIds.contains(taskInfo.taskId)) continue; evictChild(wct, taskInfo, "other_" + stageTypeToString(mId)); } } Loading