Merge "Exit split-screen if one of the splits is empty" into tm-qpr-dev
This commit is contained in:
@@ -337,17 +337,39 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
|
||||
}
|
||||
|
||||
public void startTask(int taskId, @SplitPosition int position, @Nullable Bundle options) {
|
||||
final int[] result = new int[1];
|
||||
IRemoteAnimationRunner wrapper = new IRemoteAnimationRunner.Stub() {
|
||||
@Override
|
||||
public void onAnimationStart(@WindowManager.TransitionOldType int transit,
|
||||
RemoteAnimationTarget[] apps,
|
||||
RemoteAnimationTarget[] wallpapers,
|
||||
RemoteAnimationTarget[] nonApps,
|
||||
final IRemoteAnimationFinishedCallback finishedCallback) {
|
||||
try {
|
||||
finishedCallback.onAnimationFinished();
|
||||
} catch (RemoteException e) {
|
||||
Slog.e(TAG, "Failed to invoke onAnimationFinished", e);
|
||||
}
|
||||
if (result[0] == START_SUCCESS || result[0] == START_TASK_TO_FRONT) {
|
||||
final WindowContainerTransaction evictWct = new WindowContainerTransaction();
|
||||
mStageCoordinator.prepareEvictNonOpeningChildTasks(position, apps, evictWct);
|
||||
mSyncQueue.queue(evictWct);
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public void onAnimationCancelled(boolean isKeyguardOccluded) {
|
||||
}
|
||||
};
|
||||
options = mStageCoordinator.resolveStartStage(STAGE_TYPE_UNDEFINED, position, options,
|
||||
null /* wct */);
|
||||
RemoteAnimationAdapter wrappedAdapter = new RemoteAnimationAdapter(wrapper,
|
||||
0 /* duration */, 0 /* statusBarTransitionDelay */);
|
||||
ActivityOptions activityOptions = ActivityOptions.fromBundle(options);
|
||||
activityOptions.update(ActivityOptions.makeRemoteAnimation(wrappedAdapter));
|
||||
|
||||
try {
|
||||
final WindowContainerTransaction evictWct = new WindowContainerTransaction();
|
||||
mStageCoordinator.prepareEvictChildTasks(position, evictWct);
|
||||
final int result =
|
||||
ActivityTaskManager.getService().startActivityFromRecents(taskId, options);
|
||||
if (result == START_SUCCESS || result == START_TASK_TO_FRONT) {
|
||||
mSyncQueue.queue(evictWct);
|
||||
}
|
||||
result[0] = ActivityTaskManager.getService().startActivityFromRecents(taskId,
|
||||
activityOptions.toBundle());
|
||||
} catch (RemoteException e) {
|
||||
Slog.e(TAG, "Failed to launch task", e);
|
||||
}
|
||||
|
||||
@@ -452,10 +452,16 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
IRemoteAnimationFinishedCallback finishedCallback,
|
||||
SurfaceControl.Transaction t) {
|
||||
if (apps == null || apps.length == 0) {
|
||||
// Switch the split position if launching as MULTIPLE_TASK failed.
|
||||
if ((fillInIntent.getFlags() & FLAG_ACTIVITY_MULTIPLE_TASK) != 0) {
|
||||
setSideStagePosition(SplitLayout.reversePosition(
|
||||
getSideStagePosition()), null);
|
||||
if (mMainStage.getChildCount() == 0 || mSideStage.getChildCount() == 0) {
|
||||
mMainExecutor.execute(() ->
|
||||
exitSplitScreen(mMainStage.getChildCount() == 0
|
||||
? mSideStage : mMainStage, EXIT_REASON_UNKNOWN));
|
||||
} else {
|
||||
// Switch the split position if launching as MULTIPLE_TASK failed.
|
||||
if ((fillInIntent.getFlags() & FLAG_ACTIVITY_MULTIPLE_TASK) != 0) {
|
||||
setSideStagePosition(SplitLayout.reversePosition(
|
||||
getSideStagePosition()), null);
|
||||
}
|
||||
}
|
||||
|
||||
// Do nothing when the animation was cancelled.
|
||||
@@ -651,7 +657,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
mShouldUpdateRecents = true;
|
||||
// If any stage has no child after animation finished, it means that split will display
|
||||
// nothing, such status will happen if task and intent is same app but not support
|
||||
// multi-instagce, we should exit split and expand that app as full screen.
|
||||
// multi-instance, we should exit split and expand that app as full screen.
|
||||
if (!cancel && (mMainStage.getChildCount() == 0 || mSideStage.getChildCount() == 0)) {
|
||||
mMainExecutor.execute(() ->
|
||||
exitSplitScreen(mMainStage.getChildCount() == 0
|
||||
|
||||
Reference in New Issue
Block a user