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

Commit 49e412a2 authored by Eghosa Ewansiha-Vlachavas's avatar Eghosa Ewansiha-Vlachavas
Browse files

Include source activity in trampoline bounds inheritance

Currently trampoline task bounds are inherited by detecting the visible
tasks of a trampoline and ensuring the bounds are propagated from one to
the other. Some trampoline tasks launch too quickly to become visible
and are thus not detected in this trampoline bounds inheritance. However
the source of the current launch corresponds to the previous launch in
the trampoline sequence. So instead, we should also check the source
activity if available and then any visible tasks for trampoline bounds
inheritance.

Flag: EXEMPT bug fix
Test: atest WmTests:DesktopModeLaunchParamsModifierTests
Bug: 417599443
Change-Id: I73da647a65d2b35f63b26201ab945cc15216e563
parent 11c49171
Loading
Loading
Loading
Loading
+31 −10
Original line number Diff line number Diff line
@@ -295,9 +295,11 @@ class DesktopModeLaunchParamsModifier implements LaunchParamsModifier {
        if (DesktopModeFlags.INHERIT_TASK_BOUNDS_FOR_TRAMPOLINE_TASK_LAUNCHES.isTrue()) {
            ActivityRecord topVisibleFreeformActivity =
                    task.getDisplayContent().getTopMostVisibleFreeformActivity();
            if (shouldInheritExistingTaskBounds(topVisibleFreeformActivity, targetActivity, task)) {
            final Rect inheritedBounds = getInheritedExistingTaskBounds(source,
                    topVisibleFreeformActivity, targetActivity, task);
            if (inheritedBounds != null) {
                appendLog("inheriting bounds from existing closing instance");
                outParams.mBounds.set(topVisibleFreeformActivity.getBounds());
                outParams.mBounds.set(inheritedBounds);
                appendLog("final desktop mode task bounds set to %s", outParams.mBounds);
                // Return result done to prevent other modifiers from changing or cascading bounds.
                return RESULT_DONE;
@@ -488,18 +490,37 @@ class DesktopModeLaunchParamsModifier implements LaunchParamsModifier {
    }

    /**
     * Whether the launching task should inherit the task bounds of an existing closing instance.
     * Return the bounds of an existing closing instance the launching task should inherit..
     */
    private boolean shouldInheritExistingTaskBounds(
            @Nullable ActivityRecord existingTaskActivity,
    private Rect getInheritedExistingTaskBounds(
            @Nullable ActivityRecord sourceTaskActivity,
            @Nullable ActivityRecord existingVisibleTaskActivity,
            @Nullable ActivityRecord launchingActivity,
            @NonNull Task launchingTask) {
        if (existingTaskActivity == null || launchingActivity == null) return false;
        return (Objects.equals(existingTaskActivity.packageName, launchingActivity.packageName))
                && (existingTaskActivity.mUserId == launchingTask.mUserId)
                && existingTaskActivity.getTask().mTaskId != launchingTask.mTaskId
        if (launchingActivity == null) return null;
        if (sourceTaskActivity != null && shouldInheritExistingTaskBounds(sourceTaskActivity,
                launchingActivity, launchingTask)) {
            return sourceTaskActivity.getBounds();
        }
        if (existingVisibleTaskActivity != null && shouldInheritExistingTaskBounds(
                existingVisibleTaskActivity, launchingActivity, launchingTask)) {
            return existingVisibleTaskActivity.getBounds();
        }
        return null;
    }

    /**
     * Whether the launching task should inherit the task bounds of the given activity..
     */
    private boolean shouldInheritExistingTaskBounds(
            @NonNull ActivityRecord activityToCheck,
            @NonNull ActivityRecord launchingActivity,
            @NonNull Task launchingTask) {
        return (Objects.equals(activityToCheck.packageName, launchingActivity.packageName)
                && (activityToCheck.mUserId == launchingTask.mUserId)
                && activityToCheck.getTask().mTaskId != launchingTask.mTaskId
                && isLaunchingNewSingleTask(launchingActivity.launchMode)
                && isClosingExitingInstance(launchingTask.getBaseIntent().getFlags());
                && isClosingExitingInstance(launchingTask.getBaseIntent().getFlags()));
    }

    /**
+31 −0
Original line number Diff line number Diff line
@@ -528,6 +528,37 @@ public class DesktopModeLaunchParamsModifierTests extends
                AppCompatUtils.computeAspectRatio(mResult.mAppBounds), /* delta */ 0.05);
    }

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

        final String packageName = "com.same.package";
        // Setup existing task.
        final DisplayContent dc = spy(createNewDisplay());
        final Task sourceTask = new TaskBuilder(mSupervisor).setCreateActivity(true)
                .setWindowingMode(WINDOWING_MODE_FREEFORM).setPackage(packageName).build();
        sourceTask.topRunningActivity().launchMode = LAUNCH_SINGLE_INSTANCE;
        sourceTask.setBounds(
                /* left */ 0,
                /* top */ 0,
                /* right */ 500,
                /* bottom */ 500);
        // Set up new instance of already existing task. By default multi instance is not supported
        // so first instance will close.
        final Task launchingTask = new TaskBuilder(mSupervisor).setPackage(packageName)
                .setCreateActivity(true).build();
        launchingTask.topRunningActivity().launchMode = LAUNCH_SINGLE_INSTANCE;
        launchingTask.onDisplayChanged(dc);

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

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