Loading services/core/java/com/android/server/wm/ActivityStarter.java +1 −1 Original line number Diff line number Diff line Loading @@ -1945,7 +1945,7 @@ class ActivityStarter { && sourceRecord != null && sourceRecord.getTask() == mStartActivity.getTask() && balVerdict.allows()) { mRootWindowContainer.moveActivityToPinnedRootTask(mStartActivity, sourceRecord, "launch-into-pip"); sourceRecord, "launch-into-pip", null /* bounds */); } mSupervisor.getBackgroundActivityLaunchController() Loading services/core/java/com/android/server/wm/ActivityTaskManagerService.java +16 −3 Original line number Diff line number Diff line Loading @@ -3796,9 +3796,22 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { r.shortComponentName, Boolean.toString(isAutoEnter)); r.setPictureInPictureParams(params); r.mAutoEnteringPip = isAutoEnter; if (transition != null) { mRootWindowContainer.moveActivityToPinnedRootTaskAndRequestStart(r, "enterPictureInPictureMode"); } else if (getTransitionController().isCollecting() || !getTransitionController().isShellTransitionsEnabled()) { mRootWindowContainer.moveActivityToPinnedRootTask(r, null /* launchIntoPipHostActivity */, "enterPictureInPictureMode", transition); null /* bounds */); } else { // Need to make a transition just for this. This shouldn't really happen // though because if transition == null, we should be part of an existing one. getTransitionController().createTransition(TRANSIT_PIP); mRootWindowContainer.moveActivityToPinnedRootTaskAndRequestStart(r, "enterPictureInPictureMode"); } // Continue the pausing process after entering pip. if (r.isState(PAUSING) && r.mPauseSchedulePendingForPip) { r.getTask().schedulePauseActivity(r, false /* userLeaving */, Loading services/core/java/com/android/server/wm/RootWindowContainer.java +26 −18 Original line number Diff line number Diff line Loading @@ -2032,33 +2032,39 @@ class RootWindowContainer extends WindowContainer<DisplayContent> onTop); } void moveActivityToPinnedRootTask(@NonNull ActivityRecord r, @Nullable ActivityRecord launchIntoPipHostActivity, String reason) { moveActivityToPinnedRootTask(r, launchIntoPipHostActivity, reason, null /* transition */); /** Wrapper/Helper for tests */ void moveActivityToPinnedRootTask(@NonNull ActivityRecord r, String reason) { Transition newTransit = (r.mTransitionController.isCollecting() || !r.mTransitionController.isShellTransitionsEnabled()) ? null : r.mTransitionController.createTransition(TRANSIT_PIP); moveActivityToPinnedRootTaskInner(r, null /* launchIntoPipHostActivity */, reason, null /* bounds */, newTransit != null); } void moveActivityToPinnedRootTask(@NonNull ActivityRecord r, @Nullable ActivityRecord launchIntoPipHostActivity, String reason, @Nullable Transition transition) { moveActivityToPinnedRootTask(r, launchIntoPipHostActivity, reason, transition, null /* bounds */); @Nullable Rect bounds) { moveActivityToPinnedRootTaskInner(r, launchIntoPipHostActivity, reason, bounds, false /* requestStart */); } void moveActivityToPinnedRootTask(@NonNull ActivityRecord r, /** * Moves activity to pinned in the provided transition and also requests start on that * Transition at an appropriate time. */ void moveActivityToPinnedRootTaskAndRequestStart(@NonNull ActivityRecord r, String reason) { moveActivityToPinnedRootTaskInner(r, null /* launchIntoPipHostActivity */, reason, null /* bounds */, true /* requestStart */); } private void moveActivityToPinnedRootTaskInner(@NonNull ActivityRecord r, @Nullable ActivityRecord launchIntoPipHostActivity, String reason, @Nullable Transition transition, @Nullable Rect bounds) { @Nullable Rect bounds, boolean requestStart) { final TaskDisplayArea taskDisplayArea = r.getDisplayArea(); final Task task = r.getTask(); final Task rootTask; Transition newTransition = transition; // Create a transition now (if not provided) to collect the current pinned Task dismiss. // Only do the create here as the Task (trigger) to enter PIP is not ready yet. final TransitionController transitionController = task.mTransitionController; if (newTransition == null && !transitionController.isCollecting() && transitionController.getTransitionPlayer() != null) { newTransition = transitionController.createTransition(TRANSIT_PIP); } transitionController.deferTransitionReady(); Transition.ReadyCondition pipChangesApplied = new Transition.ReadyCondition("movedToPip"); Loading Loading @@ -2273,14 +2279,16 @@ class RootWindowContainer extends WindowContainer<DisplayContent> } } if (newTransition != null) { // can be null (for now) if shell transitions are disabled or inactive at this time final Transition transit = transitionController.getCollectingTransition(); if (requestStart && transit != null) { // Request at end since we want task-organizer events from ensureActivitiesVisible // to be recognized. transitionController.requestStartTransition(newTransition, rootTask, transitionController.requestStartTransition(transit, rootTask, null /* remoteTransition */, null /* displayChange */); // A new transition was created just for this operations. Since the operation is // complete, mark it as ready. newTransition.setReady(rootTask, true /* ready */); transit.setReady(rootTask, true /* ready */); } resumeFocusedTasksTopActivities(); Loading services/core/java/com/android/server/wm/WindowOrganizerController.java +1 −1 Original line number Diff line number Diff line Loading @@ -1339,7 +1339,7 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub Rect entryBounds = hop.getBounds(); mService.mRootWindowContainer.moveActivityToPinnedRootTask( pipActivity, null /* launchIntoPipHostActivity */, "moveActivityToPinnedRootTask", null /* transition */, entryBounds); "moveActivityToPinnedRootTask", entryBounds); if (pipActivity.isState(PAUSING) && pipActivity.mPauseSchedulePendingForPip) { // Continue the pausing process. This must be done after moving PiP activity to Loading services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java +8 −16 Original line number Diff line number Diff line Loading @@ -371,8 +371,7 @@ public class RootWindowContainerTests extends WindowTestsBase { ensureTaskPlacement(fullscreenTask, firstActivity, secondActivity); // Move first activity to pinned root task. mRootWindowContainer.moveActivityToPinnedRootTask(firstActivity, null /* launchIntoPipHostActivity */, "initialMove"); mRootWindowContainer.moveActivityToPinnedRootTask(firstActivity, "initialMove"); final TaskDisplayArea taskDisplayArea = fullscreenTask.getDisplayArea(); Task pinnedRootTask = taskDisplayArea.getRootPinnedTask(); Loading @@ -381,8 +380,7 @@ public class RootWindowContainerTests extends WindowTestsBase { ensureTaskPlacement(fullscreenTask, secondActivity); // Move second activity to pinned root task. mRootWindowContainer.moveActivityToPinnedRootTask(secondActivity, null /* launchIntoPipHostActivity */, "secondMove"); mRootWindowContainer.moveActivityToPinnedRootTask(secondActivity, "secondMove"); // Need to get root tasks again as a new instance might have been created. pinnedRootTask = taskDisplayArea.getRootPinnedTask(); Loading Loading @@ -413,8 +411,7 @@ public class RootWindowContainerTests extends WindowTestsBase { // Move first activity to pinned root task. mRootWindowContainer.moveActivityToPinnedRootTask(secondActivity, null /* launchIntoPipHostActivity */, "initialMove"); mRootWindowContainer.moveActivityToPinnedRootTask(secondActivity, "initialMove"); assertTrue(firstActivity.mRequestForceTransition); } Loading @@ -434,8 +431,7 @@ public class RootWindowContainerTests extends WindowTestsBase { transientActivity.setState(RESUMED, "test"); transientActivity.getTask().moveToFront("test"); mRootWindowContainer.moveActivityToPinnedRootTask(activity2, null /* launchIntoPipHostActivity */, "test"); mRootWindowContainer.moveActivityToPinnedRootTask(activity2, "test"); assertEquals("Created PiP task must not change focus", transientActivity.getTask(), mRootWindowContainer.getTopDisplayFocusedRootTask()); final Task newPipTask = activity2.getTask(); Loading @@ -460,8 +456,7 @@ public class RootWindowContainerTests extends WindowTestsBase { final Task task = activity.getTask(); // Move activity to pinned root task. mRootWindowContainer.moveActivityToPinnedRootTask(activity, null /* launchIntoPipHostActivity */, "test"); mRootWindowContainer.moveActivityToPinnedRootTask(activity, "test"); // Ensure a task has moved over. ensureTaskPlacement(task, activity); Loading Loading @@ -499,8 +494,7 @@ public class RootWindowContainerTests extends WindowTestsBase { final Task task = activity.getTask(); // Move activity to pinned root task. mRootWindowContainer.moveActivityToPinnedRootTask(activity, null /* launchIntoPipHostActivity */, "test"); mRootWindowContainer.moveActivityToPinnedRootTask(activity, "test"); // Ensure a task has moved over. ensureTaskPlacement(task, activity); Loading @@ -524,8 +518,7 @@ public class RootWindowContainerTests extends WindowTestsBase { final ActivityRecord secondActivity = taskFragment.getBottomMostActivity(); // Move first activity to pinned root task. mRootWindowContainer.moveActivityToPinnedRootTask(firstActivity, null /* launchIntoPipHostActivity */, "test"); mRootWindowContainer.moveActivityToPinnedRootTask(firstActivity, "test"); final TaskDisplayArea taskDisplayArea = fullscreenTask.getDisplayArea(); final Task pinnedRootTask = taskDisplayArea.getRootPinnedTask(); Loading Loading @@ -556,8 +549,7 @@ public class RootWindowContainerTests extends WindowTestsBase { final ActivityRecord topActivity = taskFragment.getTopMostActivity(); // Move the top activity to pinned root task. mRootWindowContainer.moveActivityToPinnedRootTask(topActivity, null /* launchIntoPipHostActivity */, "test"); mRootWindowContainer.moveActivityToPinnedRootTask(topActivity, "test"); final Task pinnedRootTask = task.getDisplayArea().getRootPinnedTask(); Loading Loading
services/core/java/com/android/server/wm/ActivityStarter.java +1 −1 Original line number Diff line number Diff line Loading @@ -1945,7 +1945,7 @@ class ActivityStarter { && sourceRecord != null && sourceRecord.getTask() == mStartActivity.getTask() && balVerdict.allows()) { mRootWindowContainer.moveActivityToPinnedRootTask(mStartActivity, sourceRecord, "launch-into-pip"); sourceRecord, "launch-into-pip", null /* bounds */); } mSupervisor.getBackgroundActivityLaunchController() Loading
services/core/java/com/android/server/wm/ActivityTaskManagerService.java +16 −3 Original line number Diff line number Diff line Loading @@ -3796,9 +3796,22 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { r.shortComponentName, Boolean.toString(isAutoEnter)); r.setPictureInPictureParams(params); r.mAutoEnteringPip = isAutoEnter; if (transition != null) { mRootWindowContainer.moveActivityToPinnedRootTaskAndRequestStart(r, "enterPictureInPictureMode"); } else if (getTransitionController().isCollecting() || !getTransitionController().isShellTransitionsEnabled()) { mRootWindowContainer.moveActivityToPinnedRootTask(r, null /* launchIntoPipHostActivity */, "enterPictureInPictureMode", transition); null /* bounds */); } else { // Need to make a transition just for this. This shouldn't really happen // though because if transition == null, we should be part of an existing one. getTransitionController().createTransition(TRANSIT_PIP); mRootWindowContainer.moveActivityToPinnedRootTaskAndRequestStart(r, "enterPictureInPictureMode"); } // Continue the pausing process after entering pip. if (r.isState(PAUSING) && r.mPauseSchedulePendingForPip) { r.getTask().schedulePauseActivity(r, false /* userLeaving */, Loading
services/core/java/com/android/server/wm/RootWindowContainer.java +26 −18 Original line number Diff line number Diff line Loading @@ -2032,33 +2032,39 @@ class RootWindowContainer extends WindowContainer<DisplayContent> onTop); } void moveActivityToPinnedRootTask(@NonNull ActivityRecord r, @Nullable ActivityRecord launchIntoPipHostActivity, String reason) { moveActivityToPinnedRootTask(r, launchIntoPipHostActivity, reason, null /* transition */); /** Wrapper/Helper for tests */ void moveActivityToPinnedRootTask(@NonNull ActivityRecord r, String reason) { Transition newTransit = (r.mTransitionController.isCollecting() || !r.mTransitionController.isShellTransitionsEnabled()) ? null : r.mTransitionController.createTransition(TRANSIT_PIP); moveActivityToPinnedRootTaskInner(r, null /* launchIntoPipHostActivity */, reason, null /* bounds */, newTransit != null); } void moveActivityToPinnedRootTask(@NonNull ActivityRecord r, @Nullable ActivityRecord launchIntoPipHostActivity, String reason, @Nullable Transition transition) { moveActivityToPinnedRootTask(r, launchIntoPipHostActivity, reason, transition, null /* bounds */); @Nullable Rect bounds) { moveActivityToPinnedRootTaskInner(r, launchIntoPipHostActivity, reason, bounds, false /* requestStart */); } void moveActivityToPinnedRootTask(@NonNull ActivityRecord r, /** * Moves activity to pinned in the provided transition and also requests start on that * Transition at an appropriate time. */ void moveActivityToPinnedRootTaskAndRequestStart(@NonNull ActivityRecord r, String reason) { moveActivityToPinnedRootTaskInner(r, null /* launchIntoPipHostActivity */, reason, null /* bounds */, true /* requestStart */); } private void moveActivityToPinnedRootTaskInner(@NonNull ActivityRecord r, @Nullable ActivityRecord launchIntoPipHostActivity, String reason, @Nullable Transition transition, @Nullable Rect bounds) { @Nullable Rect bounds, boolean requestStart) { final TaskDisplayArea taskDisplayArea = r.getDisplayArea(); final Task task = r.getTask(); final Task rootTask; Transition newTransition = transition; // Create a transition now (if not provided) to collect the current pinned Task dismiss. // Only do the create here as the Task (trigger) to enter PIP is not ready yet. final TransitionController transitionController = task.mTransitionController; if (newTransition == null && !transitionController.isCollecting() && transitionController.getTransitionPlayer() != null) { newTransition = transitionController.createTransition(TRANSIT_PIP); } transitionController.deferTransitionReady(); Transition.ReadyCondition pipChangesApplied = new Transition.ReadyCondition("movedToPip"); Loading Loading @@ -2273,14 +2279,16 @@ class RootWindowContainer extends WindowContainer<DisplayContent> } } if (newTransition != null) { // can be null (for now) if shell transitions are disabled or inactive at this time final Transition transit = transitionController.getCollectingTransition(); if (requestStart && transit != null) { // Request at end since we want task-organizer events from ensureActivitiesVisible // to be recognized. transitionController.requestStartTransition(newTransition, rootTask, transitionController.requestStartTransition(transit, rootTask, null /* remoteTransition */, null /* displayChange */); // A new transition was created just for this operations. Since the operation is // complete, mark it as ready. newTransition.setReady(rootTask, true /* ready */); transit.setReady(rootTask, true /* ready */); } resumeFocusedTasksTopActivities(); Loading
services/core/java/com/android/server/wm/WindowOrganizerController.java +1 −1 Original line number Diff line number Diff line Loading @@ -1339,7 +1339,7 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub Rect entryBounds = hop.getBounds(); mService.mRootWindowContainer.moveActivityToPinnedRootTask( pipActivity, null /* launchIntoPipHostActivity */, "moveActivityToPinnedRootTask", null /* transition */, entryBounds); "moveActivityToPinnedRootTask", entryBounds); if (pipActivity.isState(PAUSING) && pipActivity.mPauseSchedulePendingForPip) { // Continue the pausing process. This must be done after moving PiP activity to Loading
services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java +8 −16 Original line number Diff line number Diff line Loading @@ -371,8 +371,7 @@ public class RootWindowContainerTests extends WindowTestsBase { ensureTaskPlacement(fullscreenTask, firstActivity, secondActivity); // Move first activity to pinned root task. mRootWindowContainer.moveActivityToPinnedRootTask(firstActivity, null /* launchIntoPipHostActivity */, "initialMove"); mRootWindowContainer.moveActivityToPinnedRootTask(firstActivity, "initialMove"); final TaskDisplayArea taskDisplayArea = fullscreenTask.getDisplayArea(); Task pinnedRootTask = taskDisplayArea.getRootPinnedTask(); Loading @@ -381,8 +380,7 @@ public class RootWindowContainerTests extends WindowTestsBase { ensureTaskPlacement(fullscreenTask, secondActivity); // Move second activity to pinned root task. mRootWindowContainer.moveActivityToPinnedRootTask(secondActivity, null /* launchIntoPipHostActivity */, "secondMove"); mRootWindowContainer.moveActivityToPinnedRootTask(secondActivity, "secondMove"); // Need to get root tasks again as a new instance might have been created. pinnedRootTask = taskDisplayArea.getRootPinnedTask(); Loading Loading @@ -413,8 +411,7 @@ public class RootWindowContainerTests extends WindowTestsBase { // Move first activity to pinned root task. mRootWindowContainer.moveActivityToPinnedRootTask(secondActivity, null /* launchIntoPipHostActivity */, "initialMove"); mRootWindowContainer.moveActivityToPinnedRootTask(secondActivity, "initialMove"); assertTrue(firstActivity.mRequestForceTransition); } Loading @@ -434,8 +431,7 @@ public class RootWindowContainerTests extends WindowTestsBase { transientActivity.setState(RESUMED, "test"); transientActivity.getTask().moveToFront("test"); mRootWindowContainer.moveActivityToPinnedRootTask(activity2, null /* launchIntoPipHostActivity */, "test"); mRootWindowContainer.moveActivityToPinnedRootTask(activity2, "test"); assertEquals("Created PiP task must not change focus", transientActivity.getTask(), mRootWindowContainer.getTopDisplayFocusedRootTask()); final Task newPipTask = activity2.getTask(); Loading @@ -460,8 +456,7 @@ public class RootWindowContainerTests extends WindowTestsBase { final Task task = activity.getTask(); // Move activity to pinned root task. mRootWindowContainer.moveActivityToPinnedRootTask(activity, null /* launchIntoPipHostActivity */, "test"); mRootWindowContainer.moveActivityToPinnedRootTask(activity, "test"); // Ensure a task has moved over. ensureTaskPlacement(task, activity); Loading Loading @@ -499,8 +494,7 @@ public class RootWindowContainerTests extends WindowTestsBase { final Task task = activity.getTask(); // Move activity to pinned root task. mRootWindowContainer.moveActivityToPinnedRootTask(activity, null /* launchIntoPipHostActivity */, "test"); mRootWindowContainer.moveActivityToPinnedRootTask(activity, "test"); // Ensure a task has moved over. ensureTaskPlacement(task, activity); Loading @@ -524,8 +518,7 @@ public class RootWindowContainerTests extends WindowTestsBase { final ActivityRecord secondActivity = taskFragment.getBottomMostActivity(); // Move first activity to pinned root task. mRootWindowContainer.moveActivityToPinnedRootTask(firstActivity, null /* launchIntoPipHostActivity */, "test"); mRootWindowContainer.moveActivityToPinnedRootTask(firstActivity, "test"); final TaskDisplayArea taskDisplayArea = fullscreenTask.getDisplayArea(); final Task pinnedRootTask = taskDisplayArea.getRootPinnedTask(); Loading Loading @@ -556,8 +549,7 @@ public class RootWindowContainerTests extends WindowTestsBase { final ActivityRecord topActivity = taskFragment.getTopMostActivity(); // Move the top activity to pinned root task. mRootWindowContainer.moveActivityToPinnedRootTask(topActivity, null /* launchIntoPipHostActivity */, "test"); mRootWindowContainer.moveActivityToPinnedRootTask(topActivity, "test"); final Task pinnedRootTask = task.getDisplayArea().getRootPinnedTask(); Loading