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

Commit 1ef7ddf9 authored by Eghosa Ewansiha-Vlachavas's avatar Eghosa Ewansiha-Vlachavas Committed by Android (Google) Code Review
Browse files

Merge "Include source activity in trampoline bounds inheritance" into main

parents dbc94800 49e412a2
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})