Loading services/core/java/com/android/server/wm/ActivityStarter.java +6 −0 Original line number Diff line number Diff line Loading @@ -3035,6 +3035,12 @@ class ActivityStarter { } } if (com.android.window.flags.Flags.fixLayoutExistingTask()) { // Layout the task to ensure the Task is in correct bounds. mSupervisor.getLaunchParamsController().layoutTask(intentTask, mStartActivity.info.windowLayout, mStartActivity, mSourceRecord, mOptions); } // If the target task is not in the front, then we need to bring it to the front. final boolean differentTopTask; if (mTargetRootTask.getDisplayArea() == mPreferredTaskDisplayArea) { Loading services/core/java/com/android/server/wm/DesktopModeLaunchParamsModifier.java +6 −0 Original line number Diff line number Diff line Loading @@ -74,6 +74,12 @@ class DesktopModeLaunchParamsModifier implements LaunchParamsModifier { appendLog("task null, skipping"); return RESULT_SKIP; } if (com.android.window.flags.Flags.fixLayoutExistingTask() && task.getOrganizedTask() != null) { appendLog("task is organized, skipping"); return RESULT_SKIP; } if (!task.isActivityTypeStandardOrUndefined()) { appendLog("not standard or undefined activity type, skipping"); return RESULT_SKIP; Loading services/core/java/com/android/server/wm/LaunchParamsController.java +2 −14 Original line number Diff line number Diff line Loading @@ -124,31 +124,19 @@ class LaunchParamsController { } } /** * A convenience method for laying out a task. * @return {@code true} if bounds were set on the task. {@code false} otherwise. */ boolean layoutTask(Task task, WindowLayout layout) { return layoutTask(task, layout, null /*activity*/, null /*source*/, null /*options*/); } /** @return {@code true} if bounds were set on the task. {@code false} otherwise. */ boolean layoutTask(Task task, WindowLayout layout, ActivityRecord activity, ActivityRecord source, ActivityOptions options) { calculate(task, layout, activity, source, options, null /* request */, PHASE_BOUNDS, mTmpParams); // No changes, return. if (mTmpParams.isEmpty()) { if (mTmpParams.isEmpty() || mTmpParams.mBounds.isEmpty()) { return false; } mService.deferWindowLayout(); try { if (mTmpParams.mBounds.isEmpty()) { return false; } if (task.getRootTask().inMultiWindowMode()) { task.setBounds(mTmpParams.mBounds); return true; Loading services/core/java/com/android/server/wm/Task.java +15 −12 Original line number Diff line number Diff line Loading @@ -6033,7 +6033,7 @@ class Task extends TaskFragment { IVoiceInteractor voiceInteractor, boolean toTop, ActivityRecord activity, ActivityRecord source, ActivityOptions options) { Task task; final Task task; if (canReuseAsLeafTask()) { // This root task will only contain one task, so just return itself since all root // tasks ara now tasks and all tasks are now root tasks. Loading @@ -6043,7 +6043,6 @@ class Task extends TaskFragment { final int taskId = activity != null ? mTaskSupervisor.getNextTaskIdForUser(activity.mUserId) : mTaskSupervisor.getNextTaskIdForUser(); final int activityType = getActivityType(); task = new Task.Builder(mAtmService) .setTaskId(taskId) .setActivityInfo(info) Loading @@ -6056,17 +6055,21 @@ class Task extends TaskFragment { .build(); } if (com.android.window.flags.Flags.fixLayoutExistingTask()) { mTaskSupervisor.getLaunchParamsController() .layoutTask(task, info.windowLayout, activity, source, options); } else { int displayId = getDisplayId(); if (displayId == INVALID_DISPLAY) displayId = DEFAULT_DISPLAY; final boolean isLockscreenShown = mAtmService.mTaskSupervisor.getKeyguardController() .isKeyguardOrAodShowing(displayId); final boolean isLockscreenShown = mAtmService.mKeyguardController.isKeyguardOrAodShowing(displayId); if (!mTaskSupervisor.getLaunchParamsController() .layoutTask(task, info.windowLayout, activity, source, options) && !getRequestedOverrideBounds().isEmpty() && task.isResizeable() && !isLockscreenShown) { task.setBounds(getRequestedOverrideBounds()); } } return task; } Loading services/tests/wmtests/src/com/android/server/wm/LaunchParamsControllerTests.java +10 −4 Original line number Diff line number Diff line Loading @@ -39,6 +39,7 @@ import static com.android.server.wm.LaunchParamsController.LaunchParamsModifier. import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; import android.annotation.NonNull; import android.app.ActivityOptions; import android.content.ComponentName; import android.content.pm.ActivityInfo.WindowLayout; Loading Loading @@ -293,7 +294,7 @@ public class LaunchParamsControllerTests extends WindowTestsBase { final int beforeWindowMode = task.getWindowingMode(); assertNotEquals(windowingMode, beforeWindowMode); mController.layoutTask(task, null /* windowLayout */); layoutTask(task); final int afterWindowMode = task.getWindowingMode(); assertEquals(afterWindowMode, beforeWindowMode); Loading @@ -317,7 +318,7 @@ public class LaunchParamsControllerTests extends WindowTestsBase { assertNotEquals(expected, task.getBounds()); mController.layoutTask(task, null /* windowLayout */); layoutTask(task); // Task will make adjustments to requested bounds. We only need to guarantee that the // reuqested bounds are expected. Loading @@ -342,7 +343,7 @@ public class LaunchParamsControllerTests extends WindowTestsBase { assertNotEquals(expected, task.getBounds()); mController.layoutTask(task, null /* windowLayout */); layoutTask(task); assertEquals(expected, task.getRequestedOverrideBounds()); } Loading @@ -365,7 +366,7 @@ public class LaunchParamsControllerTests extends WindowTestsBase { assertNotEquals(expected, task.getBounds()); mController.layoutTask(task, null /* windowLayout */); layoutTask(task); assertNotEquals(expected, task.getBounds()); assertEquals(expected, task.mLastNonFullscreenBounds); Loading Loading @@ -467,4 +468,9 @@ public class LaunchParamsControllerTests extends WindowTestsBase { private TestDisplayContent createNewDisplayContent() { return addNewDisplayContentAt(DisplayContent.POSITION_TOP); } private void layoutTask(@NonNull Task task) { mController.layoutTask(task, null /* layout */, null /* activity */, null /* source */, null /* options */); } } Loading
services/core/java/com/android/server/wm/ActivityStarter.java +6 −0 Original line number Diff line number Diff line Loading @@ -3035,6 +3035,12 @@ class ActivityStarter { } } if (com.android.window.flags.Flags.fixLayoutExistingTask()) { // Layout the task to ensure the Task is in correct bounds. mSupervisor.getLaunchParamsController().layoutTask(intentTask, mStartActivity.info.windowLayout, mStartActivity, mSourceRecord, mOptions); } // If the target task is not in the front, then we need to bring it to the front. final boolean differentTopTask; if (mTargetRootTask.getDisplayArea() == mPreferredTaskDisplayArea) { Loading
services/core/java/com/android/server/wm/DesktopModeLaunchParamsModifier.java +6 −0 Original line number Diff line number Diff line Loading @@ -74,6 +74,12 @@ class DesktopModeLaunchParamsModifier implements LaunchParamsModifier { appendLog("task null, skipping"); return RESULT_SKIP; } if (com.android.window.flags.Flags.fixLayoutExistingTask() && task.getOrganizedTask() != null) { appendLog("task is organized, skipping"); return RESULT_SKIP; } if (!task.isActivityTypeStandardOrUndefined()) { appendLog("not standard or undefined activity type, skipping"); return RESULT_SKIP; Loading
services/core/java/com/android/server/wm/LaunchParamsController.java +2 −14 Original line number Diff line number Diff line Loading @@ -124,31 +124,19 @@ class LaunchParamsController { } } /** * A convenience method for laying out a task. * @return {@code true} if bounds were set on the task. {@code false} otherwise. */ boolean layoutTask(Task task, WindowLayout layout) { return layoutTask(task, layout, null /*activity*/, null /*source*/, null /*options*/); } /** @return {@code true} if bounds were set on the task. {@code false} otherwise. */ boolean layoutTask(Task task, WindowLayout layout, ActivityRecord activity, ActivityRecord source, ActivityOptions options) { calculate(task, layout, activity, source, options, null /* request */, PHASE_BOUNDS, mTmpParams); // No changes, return. if (mTmpParams.isEmpty()) { if (mTmpParams.isEmpty() || mTmpParams.mBounds.isEmpty()) { return false; } mService.deferWindowLayout(); try { if (mTmpParams.mBounds.isEmpty()) { return false; } if (task.getRootTask().inMultiWindowMode()) { task.setBounds(mTmpParams.mBounds); return true; Loading
services/core/java/com/android/server/wm/Task.java +15 −12 Original line number Diff line number Diff line Loading @@ -6033,7 +6033,7 @@ class Task extends TaskFragment { IVoiceInteractor voiceInteractor, boolean toTop, ActivityRecord activity, ActivityRecord source, ActivityOptions options) { Task task; final Task task; if (canReuseAsLeafTask()) { // This root task will only contain one task, so just return itself since all root // tasks ara now tasks and all tasks are now root tasks. Loading @@ -6043,7 +6043,6 @@ class Task extends TaskFragment { final int taskId = activity != null ? mTaskSupervisor.getNextTaskIdForUser(activity.mUserId) : mTaskSupervisor.getNextTaskIdForUser(); final int activityType = getActivityType(); task = new Task.Builder(mAtmService) .setTaskId(taskId) .setActivityInfo(info) Loading @@ -6056,17 +6055,21 @@ class Task extends TaskFragment { .build(); } if (com.android.window.flags.Flags.fixLayoutExistingTask()) { mTaskSupervisor.getLaunchParamsController() .layoutTask(task, info.windowLayout, activity, source, options); } else { int displayId = getDisplayId(); if (displayId == INVALID_DISPLAY) displayId = DEFAULT_DISPLAY; final boolean isLockscreenShown = mAtmService.mTaskSupervisor.getKeyguardController() .isKeyguardOrAodShowing(displayId); final boolean isLockscreenShown = mAtmService.mKeyguardController.isKeyguardOrAodShowing(displayId); if (!mTaskSupervisor.getLaunchParamsController() .layoutTask(task, info.windowLayout, activity, source, options) && !getRequestedOverrideBounds().isEmpty() && task.isResizeable() && !isLockscreenShown) { task.setBounds(getRequestedOverrideBounds()); } } return task; } Loading
services/tests/wmtests/src/com/android/server/wm/LaunchParamsControllerTests.java +10 −4 Original line number Diff line number Diff line Loading @@ -39,6 +39,7 @@ import static com.android.server.wm.LaunchParamsController.LaunchParamsModifier. import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; import android.annotation.NonNull; import android.app.ActivityOptions; import android.content.ComponentName; import android.content.pm.ActivityInfo.WindowLayout; Loading Loading @@ -293,7 +294,7 @@ public class LaunchParamsControllerTests extends WindowTestsBase { final int beforeWindowMode = task.getWindowingMode(); assertNotEquals(windowingMode, beforeWindowMode); mController.layoutTask(task, null /* windowLayout */); layoutTask(task); final int afterWindowMode = task.getWindowingMode(); assertEquals(afterWindowMode, beforeWindowMode); Loading @@ -317,7 +318,7 @@ public class LaunchParamsControllerTests extends WindowTestsBase { assertNotEquals(expected, task.getBounds()); mController.layoutTask(task, null /* windowLayout */); layoutTask(task); // Task will make adjustments to requested bounds. We only need to guarantee that the // reuqested bounds are expected. Loading @@ -342,7 +343,7 @@ public class LaunchParamsControllerTests extends WindowTestsBase { assertNotEquals(expected, task.getBounds()); mController.layoutTask(task, null /* windowLayout */); layoutTask(task); assertEquals(expected, task.getRequestedOverrideBounds()); } Loading @@ -365,7 +366,7 @@ public class LaunchParamsControllerTests extends WindowTestsBase { assertNotEquals(expected, task.getBounds()); mController.layoutTask(task, null /* windowLayout */); layoutTask(task); assertNotEquals(expected, task.getBounds()); assertEquals(expected, task.mLastNonFullscreenBounds); Loading Loading @@ -467,4 +468,9 @@ public class LaunchParamsControllerTests extends WindowTestsBase { private TestDisplayContent createNewDisplayContent() { return addNewDisplayContentAt(DisplayContent.POSITION_TOP); } private void layoutTask(@NonNull Task task) { mController.layoutTask(task, null /* layout */, null /* activity */, null /* source */, null /* options */); } }