Loading services/core/java/com/android/server/wm/DesktopModeLaunchParamsModifier.java +31 −10 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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())); } /** Loading services/tests/wmtests/src/com/android/server/wm/DesktopModeLaunchParamsModifierTests.java +31 −0 Original line number Diff line number Diff line Loading @@ -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}) Loading Loading
services/core/java/com/android/server/wm/DesktopModeLaunchParamsModifier.java +31 −10 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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())); } /** Loading
services/tests/wmtests/src/com/android/server/wm/DesktopModeLaunchParamsModifierTests.java +31 −0 Original line number Diff line number Diff line Loading @@ -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}) Loading