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

Commit 627b8571 authored by Jeff Chang's avatar Jeff Chang
Browse files

Launch all activities into the same root task

When multiple activities are launched through a PendingIntent, all
activities need to be launched onto the same root task. To ensure
that, the launch root task information from the passed-in
SafeActivityOptions object are used to create a new
SafeActivityOptions object for bottom activities.

Bug: 243630981
Test: Drag and drop "new conversation" shortcut of Messages to split
      atest test_selectiveCloneLunchRootTask
Change-Id: I437db94f0019cf561464527147da08ccf4ac4cd3
parent a3be6a17
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -389,9 +389,9 @@ public class ActivityStartController {
        SafeActivityOptions bottomOptions = null;
        if (options != null) {
            // To ensure the first N-1 activities (N == total # of activities) are also launched
            // into the correct display, use a copy of the passed-in options (keeping only
            // display-related info) for these activities.
            bottomOptions = options.selectiveCloneDisplayOptions();
            // into the correct display and root task, use a copy of the passed-in options (keeping
            // only display-related and launch-root-task information) for these activities.
            bottomOptions = options.selectiveCloneLaunchOptions();
        }
        try {
            intents = ArrayUtils.filterNotNull(intents, Intent[]::new);
+9 −8
Original line number Diff line number Diff line
@@ -117,13 +117,13 @@ public class SafeActivityOptions {

    /**
     * To ensure that two activities, one using this object, and the other using the
     * SafeActivityOptions returned from this function, are launched into the same display through
     * ActivityStartController#startActivities, all display-related information, i.e.
     * displayAreaToken, launchDisplayId and callerDisplayId, are cloned.
     * SafeActivityOptions returned from this function, are launched into the same display/root task
     * through ActivityStartController#startActivities, all display-related information, i.e.
     * displayAreaToken, launchDisplayId, callerDisplayId and the launch root task are cloned.
     */
    @Nullable SafeActivityOptions selectiveCloneDisplayOptions() {
        final ActivityOptions options = cloneLaunchingDisplayOptions(mOriginalOptions);
        final ActivityOptions callerOptions = cloneLaunchingDisplayOptions(mCallerOptions);
    @Nullable SafeActivityOptions selectiveCloneLaunchOptions() {
        final ActivityOptions options = cloneLaunchingOptions(mOriginalOptions);
        final ActivityOptions callerOptions = cloneLaunchingOptions(mCallerOptions);
        if (options == null && callerOptions == null) {
            return null;
        }
@@ -136,11 +136,12 @@ public class SafeActivityOptions {
        return safeOptions;
    }

    private ActivityOptions cloneLaunchingDisplayOptions(ActivityOptions options) {
    private ActivityOptions cloneLaunchingOptions(ActivityOptions options) {
        return options == null ? null : ActivityOptions.makeBasic()
                .setLaunchTaskDisplayArea(options.getLaunchTaskDisplayArea())
                .setLaunchDisplayId(options.getLaunchDisplayId())
                .setCallerDisplayId((options.getCallerDisplayId()));
                .setCallerDisplayId(options.getCallerDisplayId())
                .setLaunchRootTask(options.getLaunchRootTask());
    }

    /**
+11 −1
Original line number Diff line number Diff line
@@ -57,10 +57,20 @@ public class SafeActivityOptionsTest {
                .setLaunchTaskDisplayArea(token)
                .setLaunchDisplayId(launchDisplayId)
                .setCallerDisplayId(callerDisplayId))
                .selectiveCloneDisplayOptions();
                .selectiveCloneLaunchOptions();

        assertSame(clone.getOriginalOptions().getLaunchTaskDisplayArea(), token);
        assertEquals(clone.getOriginalOptions().getLaunchDisplayId(), launchDisplayId);
        assertEquals(clone.getOriginalOptions().getCallerDisplayId(), callerDisplayId);
    }

    @Test
    public void test_selectiveCloneLunchRootTask() {
        final WindowContainerToken token = mock(WindowContainerToken.class);
        final SafeActivityOptions clone = new SafeActivityOptions(ActivityOptions.makeBasic()
                .setLaunchRootTask(token))
                .selectiveCloneLaunchOptions();

        assertSame(clone.getOriginalOptions().getLaunchRootTask(), token);
    }
}