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

Commit 718e62fd authored by Evan Rosky's avatar Evan Rosky
Browse files

Refactor ensurePip call to be more explicit

The logic in moveToPinned (regarding requestStart and
ready) was half implicit based on controller state. This
makes it hard to understand when things will happen and
also makes it hard to build tracking logic.

This lifts the implicit logic (determining whether transition
is created and needs to requestStart) up to ensurePip where
the decision is actually made.

Bug: 325114242
Test: refactor, so existing tests
Flag: EXEMPT mechanical refactor
Change-Id: If406fe1590eacbc25199dc40cd460bcd7b17c813
parent 0893341d
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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()
+16 −3
Original line number Diff line number Diff line
@@ -3794,9 +3794,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 */,
+26 −18
Original line number Diff line number Diff line
@@ -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");
@@ -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();
+1 −1
Original line number Diff line number Diff line
@@ -1329,7 +1329,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
+8 −16
Original line number Diff line number Diff line
@@ -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();
@@ -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();
@@ -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);
    }
@@ -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();
@@ -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);
@@ -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);
@@ -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();
@@ -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