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

Commit 8eb7ce7f authored by Eghosa Ewansiha-Vlachavas's avatar Eghosa Ewansiha-Vlachavas
Browse files

Allow source task bounds to be inherited if task is no longer visible

Source task bounds are currently inherited only if we can infer the
instance will be closed with the launch of the new task. However, if
the source task is no longer visible we do not need to rely on the
source instance closing as it should be safe to inherit its bounds as it
is no longer being displayed.

Flag: EXEMPT bug fix
Test: atest WmTests:DesktopModeLaunchParamsModifierTests
Fix: 425773966
Change-Id: Ic9e6bbef7a6232148e1130e1a181098ede1c2104
parent a9ac0b8b
Loading
Loading
Loading
Loading
+7 −3
Original line number Diff line number Diff line
@@ -510,7 +510,7 @@ class DesktopModeLaunchParamsModifier implements LaunchParamsModifier {
    }

    /**
     * Whether the launching task should inherit the task bounds of the given activity..
     * Whether the launching task should inherit the task bounds of the given activity.
     */
    private boolean shouldInheritExistingTaskBounds(
            @NonNull ActivityRecord activityToCheck,
@@ -519,8 +519,12 @@ class DesktopModeLaunchParamsModifier implements LaunchParamsModifier {
        return (Objects.equals(activityToCheck.packageName, launchingActivity.packageName)
                && (activityToCheck.mUserId == launchingTask.mUserId)
                && activityToCheck.getTask().mTaskId != launchingTask.mTaskId
                && isLaunchingNewSingleTask(launchingActivity.launchMode)
                && isClosingExitingInstance(launchingTask.getBaseIntent().getFlags()));
                // Safe to inherit activity bounds if activity is no longer visible or will be
                // closing as in either case there is not worry of content overlapping and being
                // obscured.
                && (!activityToCheck.isVisible()
                    || (isLaunchingNewSingleTask(launchingActivity.launchMode)
                        && isClosingExitingInstance(launchingTask.getBaseIntent().getFlags()))));
    }

    /**
+33 −1
Original line number Diff line number Diff line
@@ -528,9 +528,10 @@ public class DesktopModeLaunchParamsModifierTests extends
                AppCompatUtils.computeAspectRatio(mResult.mAppBounds), /* delta */ 0.05);
    }

    @Test
    @EnableFlags({Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE,
            Flags.FLAG_INHERIT_TASK_BOUNDS_FOR_TRAMPOLINE_TASK_LAUNCHES})
    public void testSourceTaskBoundsFromExistingInstanceIfClosing() {
    public void testInheritSourceTaskBoundsFromExistingInstanceIfClosing() {
        setupDesktopModeLaunchParamsModifier();

        final String packageName = "com.same.package";
@@ -559,6 +560,37 @@ public class DesktopModeLaunchParamsModifierTests extends
        assertEquals(sourceTask.getBounds(), mResult.mBounds);
    }

    @Test
    @EnableFlags({Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE,
            Flags.FLAG_INHERIT_TASK_BOUNDS_FOR_TRAMPOLINE_TASK_LAUNCHES})
    public void testInheritSourceTaskBoundsFromExistingInstanceIfNoLongerVisible() {
        setupDesktopModeLaunchParamsModifier();

        final String packageName = "com.same.package";
        // Setup existing task.
        final Task sourceTask = spy(new TaskBuilder(mSupervisor).setCreateActivity(true)
                .setWindowingMode(WINDOWING_MODE_FREEFORM).setPackage(packageName).build());
        sourceTask.setBounds(
                /* left */ 0,
                /* top */ 0,
                /* right */ 500,
                /* bottom */ 500);
        // Set source task activity as invisible.
        final ActivityRecord sourceTaskActivity = spy(sourceTask.getTopMostActivity());
        sourceTask.topRunningActivity().launchMode = LAUNCH_SINGLE_INSTANCE;
        doReturn(false).when(sourceTaskActivity).isVisible();
        // Set up new instance of already existing task.
        final Task launchingTask = new TaskBuilder(mSupervisor).setPackage(packageName)
                .setCreateActivity(true).build();

        // New instance should inherit task bounds of old instance.
        assertEquals(RESULT_DONE,
                new CalculateRequestBuilder().setTask(launchingTask)
                        .setActivity(launchingTask.getRootActivity())
                        .setSource(sourceTaskActivity).calculate());
        assertEquals(sourceTask.getBounds(), mResult.mBounds);
    }

    @Test
    @EnableFlags({Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE,
            Flags.FLAG_INHERIT_TASK_BOUNDS_FOR_TRAMPOLINE_TASK_LAUNCHES})