Merge "Don’t dismiss split screen while were occluded" into udc-dev am: d543ee3d47 am: b309bbbd00
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/21504131 Change-Id: Ic7f6bb1f9624a8d7f65be23ac0c5a51364f7d39a Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -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.ComponentOptions.KEY_PENDING_INTENT_BACKGROUND_ACTIVITY_ALLOWED;
|
||||
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_RECENTS;
|
||||
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 RemoteTransition remoteTransition, InstanceId instanceId) {
|
||||
final WindowContainerTransaction wct = new WindowContainerTransaction();
|
||||
prepareEvictChildTasksIfSplitActive(wct);
|
||||
setSideStagePosition(splitPosition, wct);
|
||||
options1 = options1 != null ? options1 : new Bundle();
|
||||
addActivityOptions(options1, mSideStage);
|
||||
@@ -675,6 +675,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
@SplitPosition int splitPosition, float splitRatio,
|
||||
@Nullable RemoteTransition remoteTransition, InstanceId instanceId) {
|
||||
final WindowContainerTransaction wct = new WindowContainerTransaction();
|
||||
prepareEvictChildTasksIfSplitActive(wct);
|
||||
setSideStagePosition(splitPosition, wct);
|
||||
options1 = options1 != null ? options1 : new Bundle();
|
||||
addActivityOptions(options1, mSideStage);
|
||||
@@ -688,6 +689,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
int taskId, @Nullable Bundle options2, @SplitPosition int splitPosition,
|
||||
float splitRatio, @Nullable RemoteTransition remoteTransition, InstanceId instanceId) {
|
||||
final WindowContainerTransaction wct = new WindowContainerTransaction();
|
||||
prepareEvictChildTasksIfSplitActive(wct);
|
||||
setSideStagePosition(splitPosition, wct);
|
||||
options1 = options1 != null ? options1 : new Bundle();
|
||||
addActivityOptions(options1, mSideStage);
|
||||
@@ -706,10 +708,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
private void startWithTask(WindowContainerTransaction wct, int mainTaskId,
|
||||
@Nullable Bundle mainOptions, float splitRatio,
|
||||
@Nullable RemoteTransition remoteTransition, InstanceId instanceId) {
|
||||
if (mMainStage.isActive()) {
|
||||
mMainStage.evictAllChildren(wct);
|
||||
mSideStage.evictAllChildren(wct);
|
||||
} else {
|
||||
if (!mMainStage.isActive()) {
|
||||
// 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.
|
||||
mMainStage.activate(wct, false /* reparent */);
|
||||
@@ -1020,6 +1019,13 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
mSideStage.evictInvisibleChildren(wct);
|
||||
}
|
||||
|
||||
void prepareEvictChildTasksIfSplitActive(WindowContainerTransaction wct) {
|
||||
if (mMainStage.isActive()) {
|
||||
mMainStage.evictAllChildren(wct);
|
||||
mSideStage.evictAllChildren(wct);
|
||||
}
|
||||
}
|
||||
|
||||
Bundle resolveStartStage(@StageType int stage, @SplitPosition int position,
|
||||
@Nullable Bundle options, @Nullable WindowContainerTransaction wct) {
|
||||
switch (stage) {
|
||||
@@ -2160,19 +2166,11 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
}
|
||||
} else if (isOpening && inFullscreen) {
|
||||
final int activityType = triggerTask.getActivityType();
|
||||
if (activityType == ACTIVITY_TYPE_ASSISTANT) {
|
||||
// We don't want assistant panel to dismiss split screen, so do nothing.
|
||||
} else if (activityType == ACTIVITY_TYPE_HOME
|
||||
if (activityType == ACTIVITY_TYPE_HOME
|
||||
|| activityType == ACTIVITY_TYPE_RECENTS) {
|
||||
// Enter overview panel, so start recent transition.
|
||||
mSplitTransitions.setRecentTransition(transition, request.getRemoteTransition(),
|
||||
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 {
|
||||
|
||||
@@ -282,41 +282,6 @@ public class SplitTransitionTests extends ShellTestCase {
|
||||
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
|
||||
@UiThreadTest
|
||||
public void testDismissFromMultiWindowSupport() {
|
||||
|
||||
Reference in New Issue
Block a user