Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7c49083f authored by Winson Chung's avatar Winson Chung Committed by Tony Huang
Browse files

Add missing fallback for tasks which can't be split

- Fallback to launching in fullscreen if we can't split the
  tasks

Bug: 277021180
Test: Manual - Split with calculator in AA & taskbar AA
Test: atest TaplTestsSplitscreen
Change-Id: I9d2f9188cd5bc3ece304442d42f4671005cf8d45
parent d48f9238
Loading
Loading
Loading
Loading
+36 −3
Original line number Diff line number Diff line
@@ -541,6 +541,34 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
                instanceId);
    }

    void startShortcutAndTask(ShortcutInfo shortcutInfo, @Nullable Bundle options1,
            int taskId, @Nullable Bundle options2, @SplitPosition int splitPosition,
            float splitRatio, @Nullable RemoteTransition remoteTransition, InstanceId instanceId) {
        if (options1 == null) options1 = new Bundle();
        final ActivityOptions activityOptions = ActivityOptions.fromBundle(options1);
        final String packageName1 = shortcutInfo.getPackage();
        // NOTE: This doesn't correctly pull out packageName2 if taskId is referring to a task in
        //       recents that hasn't launched and is not being organized
        final String packageName2 = SplitScreenUtils.getPackageName(taskId, mTaskOrganizer);
        if (samePackage(packageName1, packageName2)) {
            if (supportMultiInstancesSplit(packageName1)) {
                activityOptions.setApplyMultipleTaskFlagForShortcut(true);
                ProtoLog.v(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN, "Adding MULTIPLE_TASK");
            } else {
                if (mRecentTasksOptional.isPresent()) {
                    mRecentTasksOptional.get().removeSplitPair(taskId);
                }
                taskId = INVALID_TASK_ID;
                ProtoLog.v(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN,
                        "Cancel entering split as not supporting multi-instances");
                Toast.makeText(mContext, R.string.dock_multi_instances_not_supported_text,
                        Toast.LENGTH_SHORT).show();
            }
        }
        mStageCoordinator.startShortcutAndTask(shortcutInfo, options1, taskId, options2,
                splitPosition, splitRatio, remoteTransition, instanceId);
    }

    /**
     * See {@link #startIntent(PendingIntent, Intent, int, Bundle)}
     * @param instanceId to be used by {@link SplitscreenEventLogger}
@@ -580,6 +608,8 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
            float splitRatio, @Nullable RemoteTransition remoteTransition, InstanceId instanceId) {
        Intent fillInIntent = null;
        final String packageName1 = SplitScreenUtils.getPackageName(pendingIntent);
        // NOTE: This doesn't correctly pull out packageName2 if taskId is referring to a task in
        //       recents that hasn't launched and is not being organized
        final String packageName2 = SplitScreenUtils.getPackageName(taskId, mTaskOrganizer);
        if (samePackage(packageName1, packageName2)) {
            if (supportMultiInstancesSplit(packageName1)) {
@@ -587,6 +617,10 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
                fillInIntent.addFlags(FLAG_ACTIVITY_MULTIPLE_TASK);
                ProtoLog.v(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN, "Adding MULTIPLE_TASK");
            } else {
                if (mRecentTasksOptional.isPresent()) {
                    mRecentTasksOptional.get().removeSplitPair(taskId);
                }
                taskId = INVALID_TASK_ID;
                ProtoLog.v(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN,
                        "Cancel entering split as not supporting multi-instances");
                Toast.makeText(mContext, R.string.dock_multi_instances_not_supported_text,
@@ -1075,9 +1109,8 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
                float splitRatio, @Nullable RemoteTransition remoteTransition,
                InstanceId instanceId) {
            executeRemoteCallWithTaskPermission(mController, "startShortcutAndTask",
                    (controller) -> controller.mStageCoordinator.startShortcutAndTask(shortcutInfo,
                            options1, taskId, options2, splitPosition, splitRatio, remoteTransition,
                            instanceId));
                    (controller) -> controller.startShortcutAndTask(shortcutInfo, options1, taskId,
                            options2, splitPosition, splitRatio, remoteTransition, instanceId));
        }

        @Override
+6 −0
Original line number Diff line number Diff line
@@ -289,6 +289,12 @@ class SplitScreenTransitions {
        return null;
    }

    void startFullscreenTransition(WindowContainerTransaction wct,
            @Nullable RemoteTransition handler) {
        mTransitions.startTransition(TRANSIT_OPEN, wct,
                new OneShotRemoteHandler(mTransitions.getMainExecutor(), handler));
    }


    /** Starts a transition to enter split with a remote transition animator. */
    IBinder startEnterTransition(
+38 −0
Original line number Diff line number Diff line
@@ -612,6 +612,19 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
            @Nullable Bundle options2, @SplitPosition int splitPosition, float splitRatio,
            @Nullable RemoteTransition remoteTransition, InstanceId instanceId) {
        final WindowContainerTransaction wct = new WindowContainerTransaction();
        if (taskId2 == INVALID_TASK_ID) {
            if (mMainStage.containsTask(taskId1) || mSideStage.containsTask(taskId1)) {
                prepareExitSplitScreen(STAGE_TYPE_UNDEFINED, wct);
            }
            if (mRecentTasks.isPresent()) {
                mRecentTasks.get().removeSplitPair(taskId1);
            }
            options1 = options1 != null ? options1 : new Bundle();
            wct.startTask(taskId1, options1);
            mSplitTransitions.startFullscreenTransition(wct, remoteTransition);
            return;
        }

        prepareEvictChildTasksIfSplitActive(wct);
        setSideStagePosition(splitPosition, wct);
        options1 = options1 != null ? options1 : new Bundle();
@@ -627,6 +640,13 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
            @SplitPosition int splitPosition, float splitRatio,
            @Nullable RemoteTransition remoteTransition, InstanceId instanceId) {
        final WindowContainerTransaction wct = new WindowContainerTransaction();
        if (taskId == INVALID_TASK_ID) {
            options1 = options1 != null ? options1 : new Bundle();
            wct.sendPendingIntent(pendingIntent, fillInIntent, options1);
            mSplitTransitions.startFullscreenTransition(wct, remoteTransition);
            return;
        }

        prepareEvictChildTasksIfSplitActive(wct);
        setSideStagePosition(splitPosition, wct);
        options1 = options1 != null ? options1 : new Bundle();
@@ -641,6 +661,13 @@ 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();
        if (taskId == INVALID_TASK_ID) {
            options1 = options1 != null ? options1 : new Bundle();
            wct.startShortcut(mContext.getPackageName(), shortcutInfo, options1);
            mSplitTransitions.startFullscreenTransition(wct, remoteTransition);
            return;
        }

        prepareEvictChildTasksIfSplitActive(wct);
        setSideStagePosition(splitPosition, wct);
        options1 = options1 != null ? options1 : new Bundle();
@@ -689,6 +716,17 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
            @SplitPosition int splitPosition, float splitRatio,
            @Nullable RemoteTransition remoteTransition, InstanceId instanceId) {
        final WindowContainerTransaction wct = new WindowContainerTransaction();
        if (pendingIntent2 == null) {
            options1 = options1 != null ? options1 : new Bundle();
            if (shortcutInfo1 != null) {
                wct.startShortcut(mContext.getPackageName(), shortcutInfo1, options1);
            } else {
                wct.sendPendingIntent(pendingIntent1, fillInIntent1, options1);
            }
            mSplitTransitions.startFullscreenTransition(wct, remoteTransition);
            return;
        }

        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.