Merge "Don’t dismiss split screen while were occluded" into udc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
d543ee3d47
@@ -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 {
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
Reference in New Issue
Block a user