Merge "Don’t dismiss split screen while were occluded" into udc-dev

This commit is contained in:
TreeHugger Robot
2023-03-03 02:00:09 +00:00
committed by Android (Google) Code Review
2 changed files with 12 additions and 49 deletions

View File

@@ -20,7 +20,6 @@ import static android.app.ActivityOptions.KEY_LAUNCH_ROOT_TASK_TOKEN;
import static android.app.ActivityTaskManager.INVALID_TASK_ID; import static android.app.ActivityTaskManager.INVALID_TASK_ID;
import static android.app.ComponentOptions.KEY_PENDING_INTENT_BACKGROUND_ACTIVITY_ALLOWED; import static android.app.ComponentOptions.KEY_PENDING_INTENT_BACKGROUND_ACTIVITY_ALLOWED;
import static android.app.ComponentOptions.KEY_PENDING_INTENT_BACKGROUND_ACTIVITY_ALLOWED_BY_PERMISSION; import static android.app.ComponentOptions.KEY_PENDING_INTENT_BACKGROUND_ACTIVITY_ALLOWED_BY_PERMISSION;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_ASSISTANT;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME; import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_RECENTS; import static android.app.WindowConfiguration.ACTIVITY_TYPE_RECENTS;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
@@ -661,6 +660,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
@Nullable Bundle options2, @SplitPosition int splitPosition, float splitRatio, @Nullable Bundle options2, @SplitPosition int splitPosition, float splitRatio,
@Nullable RemoteTransition remoteTransition, InstanceId instanceId) { @Nullable RemoteTransition remoteTransition, InstanceId instanceId) {
final WindowContainerTransaction wct = new WindowContainerTransaction(); final WindowContainerTransaction wct = new WindowContainerTransaction();
prepareEvictChildTasksIfSplitActive(wct);
setSideStagePosition(splitPosition, wct); setSideStagePosition(splitPosition, wct);
options1 = options1 != null ? options1 : new Bundle(); options1 = options1 != null ? options1 : new Bundle();
addActivityOptions(options1, mSideStage); addActivityOptions(options1, mSideStage);
@@ -675,6 +675,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
@SplitPosition int splitPosition, float splitRatio, @SplitPosition int splitPosition, float splitRatio,
@Nullable RemoteTransition remoteTransition, InstanceId instanceId) { @Nullable RemoteTransition remoteTransition, InstanceId instanceId) {
final WindowContainerTransaction wct = new WindowContainerTransaction(); final WindowContainerTransaction wct = new WindowContainerTransaction();
prepareEvictChildTasksIfSplitActive(wct);
setSideStagePosition(splitPosition, wct); setSideStagePosition(splitPosition, wct);
options1 = options1 != null ? options1 : new Bundle(); options1 = options1 != null ? options1 : new Bundle();
addActivityOptions(options1, mSideStage); addActivityOptions(options1, mSideStage);
@@ -688,6 +689,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
int taskId, @Nullable Bundle options2, @SplitPosition int splitPosition, int taskId, @Nullable Bundle options2, @SplitPosition int splitPosition,
float splitRatio, @Nullable RemoteTransition remoteTransition, InstanceId instanceId) { float splitRatio, @Nullable RemoteTransition remoteTransition, InstanceId instanceId) {
final WindowContainerTransaction wct = new WindowContainerTransaction(); final WindowContainerTransaction wct = new WindowContainerTransaction();
prepareEvictChildTasksIfSplitActive(wct);
setSideStagePosition(splitPosition, wct); setSideStagePosition(splitPosition, wct);
options1 = options1 != null ? options1 : new Bundle(); options1 = options1 != null ? options1 : new Bundle();
addActivityOptions(options1, mSideStage); addActivityOptions(options1, mSideStage);
@@ -706,10 +708,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
private void startWithTask(WindowContainerTransaction wct, int mainTaskId, private void startWithTask(WindowContainerTransaction wct, int mainTaskId,
@Nullable Bundle mainOptions, float splitRatio, @Nullable Bundle mainOptions, float splitRatio,
@Nullable RemoteTransition remoteTransition, InstanceId instanceId) { @Nullable RemoteTransition remoteTransition, InstanceId instanceId) {
if (mMainStage.isActive()) { if (!mMainStage.isActive()) {
mMainStage.evictAllChildren(wct);
mSideStage.evictAllChildren(wct);
} else {
// Build a request WCT that will launch both apps such that task 0 is on the main stage // Build a request WCT that will launch both apps such that task 0 is on the main stage
// while task 1 is on the side stage. // while task 1 is on the side stage.
mMainStage.activate(wct, false /* reparent */); mMainStage.activate(wct, false /* reparent */);
@@ -1020,6 +1019,13 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
mSideStage.evictInvisibleChildren(wct); mSideStage.evictInvisibleChildren(wct);
} }
void prepareEvictChildTasksIfSplitActive(WindowContainerTransaction wct) {
if (mMainStage.isActive()) {
mMainStage.evictAllChildren(wct);
mSideStage.evictAllChildren(wct);
}
}
Bundle resolveStartStage(@StageType int stage, @SplitPosition int position, Bundle resolveStartStage(@StageType int stage, @SplitPosition int position,
@Nullable Bundle options, @Nullable WindowContainerTransaction wct) { @Nullable Bundle options, @Nullable WindowContainerTransaction wct) {
switch (stage) { switch (stage) {
@@ -2160,19 +2166,11 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
} }
} else if (isOpening && inFullscreen) { } else if (isOpening && inFullscreen) {
final int activityType = triggerTask.getActivityType(); final int activityType = triggerTask.getActivityType();
if (activityType == ACTIVITY_TYPE_ASSISTANT) { if (activityType == ACTIVITY_TYPE_HOME
// We don't want assistant panel to dismiss split screen, so do nothing.
} else if (activityType == ACTIVITY_TYPE_HOME
|| activityType == ACTIVITY_TYPE_RECENTS) { || activityType == ACTIVITY_TYPE_RECENTS) {
// Enter overview panel, so start recent transition. // Enter overview panel, so start recent transition.
mSplitTransitions.setRecentTransition(transition, request.getRemoteTransition(), mSplitTransitions.setRecentTransition(transition, request.getRemoteTransition(),
mRecentTransitionFinishedCallback); mRecentTransitionFinishedCallback);
} else if (mSplitTransitions.mPendingRecent == null) {
// If split-task is not controlled by recents animation
// and occluded by the other fullscreen task, dismiss both.
prepareExitSplitScreen(STAGE_TYPE_UNDEFINED, out);
mSplitTransitions.setDismissTransition(
transition, STAGE_TYPE_UNDEFINED, EXIT_REASON_UNKNOWN);
} }
} }
} else { } else {

View File

@@ -282,41 +282,6 @@ public class SplitTransitionTests extends ShellTestCase {
assertTrue(mStageCoordinator.isSplitScreenVisible()); assertTrue(mStageCoordinator.isSplitScreenVisible());
} }
@Test
@UiThreadTest
public void testDismissFromBeingOccluded() {
enterSplit();
ActivityManager.RunningTaskInfo normalTask = new TestRunningTaskInfoBuilder()
.setWindowingMode(WINDOWING_MODE_FULLSCREEN)
.build();
// Create a request to bring a normal task forward
TransitionRequestInfo request =
new TransitionRequestInfo(TRANSIT_TO_FRONT, normalTask, null);
IBinder transition = mock(IBinder.class);
WindowContainerTransaction result = mStageCoordinator.handleRequest(transition, request);
assertTrue(containsSplitExit(result));
// make sure we haven't made any local changes yet (need to wait until transition is ready)
assertTrue(mStageCoordinator.isSplitScreenVisible());
// simulate the transition
TransitionInfo info = new TransitionInfoBuilder(TRANSIT_TO_FRONT, 0)
.addChange(TRANSIT_TO_FRONT, normalTask)
.addChange(TRANSIT_TO_BACK, mMainChild)
.addChange(TRANSIT_TO_BACK, mSideChild)
.build();
mMainStage.onTaskVanished(mMainChild);
mSideStage.onTaskVanished(mSideChild);
mStageCoordinator.startAnimation(transition, info,
mock(SurfaceControl.Transaction.class),
mock(SurfaceControl.Transaction.class),
mock(Transitions.TransitionFinishCallback.class));
assertFalse(mStageCoordinator.isSplitScreenVisible());
}
@Test @Test
@UiThreadTest @UiThreadTest
public void testDismissFromMultiWindowSupport() { public void testDismissFromMultiWindowSupport() {