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

Commit b0a2d965 authored by Evan Rosky's avatar Evan Rosky
Browse files

Split collect logic out of requestIfNeeded methods

In order to support proper tracking, we need to be
explicit about which transitions we collect changes into. The,
"ifNeeded" functions hard-code the global collector as the
fallback which isn't compatible with this goal.

This CL separates the collect logic out of the requestStart
variants so that callers can specify where to collect changes.

Bug: 325114242
Test: N/A. This is a no-op refactor so existing tests should cover.
Change-Id: I632b0eb0f1ac3693c41bb1d7476ed37cbd2afeb2
parent acbdee14
Loading
Loading
Loading
Loading
+13 −2
Original line number Diff line number Diff line
@@ -3722,8 +3722,14 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A

            final boolean endTask = task.getTopNonFinishingActivity() == null
                    && !task.isClearingToReuseTask();
            final WindowContainer<?> trigger = endTask ? task : this;
            final Transition newTransition =
                    mTransitionController.requestCloseTransitionIfNeeded(endTask ? task : this);
                    mTransitionController.requestCloseTransitionIfNeeded(trigger);
            if (newTransition != null) {
                newTransition.collectClose(trigger);
            } else if (mTransitionController.isCollecting()) {
                mTransitionController.getCollectingTransition().collectClose(trigger);
            }
            if (isState(RESUMED)) {
                if (endTask) {
                    mAtmService.getTaskChangeNotificationController().notifyTaskRemovalStarted(
@@ -4384,7 +4390,12 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
        // closing the task.
        final WindowContainer trigger = remove && task != null && task.getChildCount() == 1
                ? task : this;
        mTransitionController.requestCloseTransitionIfNeeded(trigger);
        final Transition newTransit = mTransitionController.requestCloseTransitionIfNeeded(trigger);
        if (newTransit != null) {
            newTransit.collectClose(trigger);
        } else if (mTransitionController.isCollecting()) {
            mTransitionController.getCollectingTransition().collectClose(trigger);
        }
        cleanUp(true /* cleanServices */, true /* setState */);
        if (remove) {
            if (mStartingData != null && mVisible && task != null) {
+1 −1
Original line number Diff line number Diff line
@@ -3665,7 +3665,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
    }

    /**
     * Prepare to enter PiP mode after {@link TransitionController#requestStartTransition}.
     * Prepare to enter PiP mode after {@link TransitionController#requestStartDisplayTransition}.
     *
     * @param r activity auto entering pip
     * @return true if the activity is about to auto-enter pip or is already in pip mode.
+14 −4
Original line number Diff line number Diff line
@@ -1597,9 +1597,14 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks {
    }

    private void removePinnedRootTaskInSurfaceTransaction(Task rootTask) {
        rootTask.mTransitionController.requestTransitionIfNeeded(TRANSIT_TO_BACK, 0 /* flags */,
                rootTask, rootTask.mDisplayContent, null /* remoteTransition */,
                null /* displayChange */);
        final Transition transition = rootTask.mTransitionController.requestTransitionIfNeeded(
                TRANSIT_TO_BACK, 0 /* flags */, rootTask, rootTask.mDisplayContent);
        if (transition == null) {
            rootTask.mTransitionController.collect(rootTask);
        } else {
            transition.collect(rootTask);
        }

        /**
         * Workaround: Force-stop all the activities in the root pinned task before we reparent them
         * to the fullscreen root task.  This is to guarantee that when we are removing a root task,
@@ -1682,7 +1687,12 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks {
            // Prevent recursion.
            return;
        }
        task.mTransitionController.requestCloseTransitionIfNeeded(task);
        final Transition transit = task.mTransitionController.requestCloseTransitionIfNeeded(task);
        if (transit != null) {
            transit.collectClose(task);
        } else if (task.mTransitionController.isCollecting()) {
            task.mTransitionController.getCollectingTransition().collectClose(task);
        }
        // Consume the stopping activities immediately so activity manager won't skip killing
        // the process because it is still foreground state, i.e. RESUMED -> PAUSING set from
        // removeActivities -> finishIfPossible.
+62 −60
Original line number Diff line number Diff line
@@ -1625,22 +1625,23 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp

        if (configChanged) {
            mWaitingForConfig = true;
            if (mTransitionController.isShellTransitionsEnabled()) {
            if (mLastHasContent && mTransitionController.isShellTransitionsEnabled()) {
                final Rect startBounds = currentDisplayConfig.windowConfiguration.getBounds();
                final Rect endBounds = mTmpConfiguration.windowConfiguration.getBounds();
                final Transition transition = mTransitionController.getCollectingTransition();
                final TransitionRequestInfo.DisplayChange change = transition != null
                                ? null : new TransitionRequestInfo.DisplayChange(mDisplayId);
                if (change != null) {
                if (!mTransitionController.isCollecting()) {
                    final TransitionRequestInfo.DisplayChange change =
                            new TransitionRequestInfo.DisplayChange(mDisplayId);
                    change.setStartAbsBounds(startBounds);
                    change.setEndAbsBounds(endBounds);
                    requestChangeTransition(changes, change);
                } else {
                    final Transition transition = mTransitionController.getCollectingTransition();
                    transition.setKnownConfigChanges(this, changes);
                    // A collecting transition is existed. The sync method must be set before
                    // collecting this display, so WindowState#prepareSync can use the sync method.
                    mTransitionController.setDisplaySyncMethod(startBounds, endBounds, this);
                    collectDisplayChange(transition);
                }
                requestChangeTransitionIfNeeded(changes, change);
            } else if (mLastHasContent) {
                mWmService.startFreezingDisplay(0 /* exitAnim */, 0 /* enterAnim */, this);
            }
@@ -3551,32 +3552,35 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
    }

    /**
     * Requests to start a transition for the display configuration change. The given changes must
     * be non-zero. This method is no-op if the display has been collected.
     * Collects this display into an already-collecting transition.
     */
    void requestChangeTransitionIfNeeded(@ActivityInfo.Config int changes,
            @Nullable TransitionRequestInfo.DisplayChange displayChange) {
    void collectDisplayChange(@NonNull Transition transition) {
        if (!mLastHasContent) return;
        final TransitionController controller = mTransitionController;
        if (controller.isCollecting()) {
            if (displayChange != null) {
                throw new IllegalArgumentException("Provided displayChange for non-new transition");
        if (!transition.isCollecting()) {
            throw new IllegalArgumentException("Can only collect display change if transition"
                    + " is collecting");
        }
            if (!controller.isCollecting(this)) {
                controller.collect(this);
        if (!transition.mParticipants.contains(this)) {
            transition.collect(this);
            startAsyncRotationIfNeeded();
            if (mFixedRotationLaunchingApp != null) {
                    setSeamlessTransitionForFixedRotation(controller.getCollectingTransition());
                setSeamlessTransitionForFixedRotation(transition);
            }
        } else if (mAsyncRotationController != null && !isRotationChanging()) {
            Slog.i(TAG, "Finish AsyncRotation for previous intermediate change");
            finishAsyncRotationIfPossible();
        }
            return;
    }
        final Transition t = controller.requestTransitionIfNeeded(TRANSIT_CHANGE, 0 /* flags */,
                this, this, null /* remoteTransition */, displayChange);
        if (t != null) {

    /**
     * Requests to start a transition for a display change. {@code changes} must be non-zero.
     */
    void requestChangeTransition(@ActivityInfo.Config int changes,
            @Nullable TransitionRequestInfo.DisplayChange displayChange) {
        final TransitionController controller = mTransitionController;
        final Transition t = controller.requestStartDisplayTransition(TRANSIT_CHANGE, 0 /* flags */,
                this, null /* remoteTransition */, displayChange);
        t.collect(this);
        mAtmService.startPowerMode(POWER_MODE_REASON_CHANGE_DISPLAY);
        if (mAsyncRotationController != null) {
            // Give a chance to update the transform if the current rotation is changed when
@@ -3603,7 +3607,6 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
        }
        t.setKnownConfigChanges(this, changes);
    }
    }

    private void setSeamlessTransitionForFixedRotation(Transition t) {
        t.setSeamlessRotation(this);
@@ -5722,14 +5725,8 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
     */
    void requestTransitionAndLegacyPrepare(@WindowManager.TransitionType int transit,
            @WindowManager.TransitionFlags int flags) {
        requestTransitionAndLegacyPrepare(transit, flags, null /* trigger */);
    }

    /** @see #requestTransitionAndLegacyPrepare(int, int) */
    void requestTransitionAndLegacyPrepare(@WindowManager.TransitionType int transit,
            @WindowManager.TransitionFlags int flags, @Nullable WindowContainer trigger) {
        prepareAppTransition(transit, flags);
        mTransitionController.requestTransitionIfNeeded(transit, flags, trigger, this);
        mTransitionController.requestTransitionIfNeeded(transit, flags, null /* trigger */, this);
    }

    void executeAppTransition() {
@@ -6372,8 +6369,13 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
        if (changes != 0) {
            Slog.i(TAG, "Override config changes=" + Integer.toHexString(changes) + " "
                    + mTempConfig + " for displayId=" + mDisplayId);
            if (isReady() && mTransitionController.isShellTransitionsEnabled()) {
                requestChangeTransitionIfNeeded(changes, null /* displayChange */);
            if (isReady() && mTransitionController.isShellTransitionsEnabled() && mLastHasContent) {
                final Transition transition = mTransitionController.getCollectingTransition();
                if (transition != null) {
                    collectDisplayChange(transition);
                } else {
                    requestChangeTransition(changes, null /* displayChange */);
                }
            }
            onRequestedOverrideConfigurationChanged(mTempConfig);

+11 −7
Original line number Diff line number Diff line
@@ -629,13 +629,17 @@ public class DisplayRotation {

        if (mDisplayContent.mTransitionController.isShellTransitionsEnabled()) {
            final boolean wasCollecting = mDisplayContent.mTransitionController.isCollecting();
            final TransitionRequestInfo.DisplayChange change = wasCollecting ? null
                    : new TransitionRequestInfo.DisplayChange(mDisplayContent.getDisplayId(),
            if (!wasCollecting) {
                if (mDisplayContent.getLastHasContent()) {
                    final TransitionRequestInfo.DisplayChange change =
                            new TransitionRequestInfo.DisplayChange(mDisplayContent.getDisplayId(),
                                    oldRotation, mRotation);

            mDisplayContent.requestChangeTransitionIfNeeded(
                    mDisplayContent.requestChangeTransition(
                            ActivityInfo.CONFIG_WINDOW_CONFIGURATION, change);
            if (wasCollecting) {
                }
            } else {
                mDisplayContent.collectDisplayChange(
                        mDisplayContent.mTransitionController.getCollectingTransition());
                // Use remote-rotation infra since the transition has already been requested
                // TODO(shell-transitions): Remove this once lifecycle management can cover all
                //                          rotation cases.
Loading