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

Commit 6adca835 authored by Riddle Hsu's avatar Riddle Hsu
Browse files

Put transition collect in scope of defer layout

Transition#collect will call BLASTSyncEngine.SyncGroup#addToSync,
which will request traversal. If it is called on a path which
will perform traversal at the end, the traversal request can
be consumed by that to avoid additional cost.

Bug: 260059642
Test: Enable shell transition.
      Launch an activity and check trace that there is no additional
      performSurfacePlacement on android.anim thread.
Change-Id: I6e58fc75f4f435ee730eff1bcc94848bdaedfbf0
parent 58de71a4
Loading
Loading
Loading
Loading
+26 −21
Original line number Diff line number Diff line
@@ -556,47 +556,52 @@ public class ActivityStartController {
        final Task rootTask = mService.mRootWindowContainer.getDefaultTaskDisplayArea()
                .getRootTask(WINDOWING_MODE_UNDEFINED, activityType);
        if (rootTask == null) return false;
        final RemoteTransition remote = options.getRemoteTransition();
        final ActivityRecord r = rootTask.topRunningActivity();
        if (r == null || r.mVisibleRequested || !r.attachedToProcess()
        if (r == null || r.mVisibleRequested || !r.attachedToProcess() || remote == null
                || !r.mActivityComponent.equals(intent.getComponent())
                // Recents keeps invisible while device is locked.
                || r.mDisplayContent.isKeyguardLocked()) {
            return false;
        }
        mService.mRootWindowContainer.startPowerModeLaunchIfNeeded(true /* forceSend */, r);
        final RemoteTransition remote = options.getRemoteTransition();
        if (remote != null && rootTask.mTransitionController.isCollecting()) {
        final ActivityMetricsLogger.LaunchingState launchingState =
                mSupervisor.getActivityMetricsLogger().notifyActivityLaunching(intent);
        final Transition transition = new Transition(WindowManager.TRANSIT_TO_FRONT,
                    0 /* flags */, rootTask.mTransitionController,
                    mService.mWindowManager.mSyncEngine);
                0 /* flags */, r.mTransitionController, mService.mWindowManager.mSyncEngine);
        if (r.mTransitionController.isCollecting()) {
            // Special case: we are entering recents while an existing transition is running. In
            // this case, we know it's safe to "defer" the activity launch, so lets do so now so
            // that it can get its own transition and thus update launcher correctly.
            mService.mWindowManager.mSyncEngine.queueSyncSet(
                    () -> rootTask.mTransitionController.moveToCollecting(transition),
                    () -> {
                        final Task task = r.getTask();
                        task.mTransitionController.requestStartTransition(transition,
                                task, remote, null /* displayChange */);
                        task.mTransitionController.collect(task);
                        startExistingRecentsIfPossibleInner(intent, options, r, task, rootTask);
                        if (r.isAttached()) {
                            r.mTransitionController.moveToCollecting(transition);
                        }
                    },
                    () -> {
                        if (r.isAttached() && transition.isCollecting()) {
                            startExistingRecentsIfPossibleInner(options, r, rootTask,
                                    launchingState, remote, transition);
                        }
                    });
        } else {
            final Task task = r.getTask();
            task.mTransitionController.requestTransitionIfNeeded(WindowManager.TRANSIT_TO_FRONT,
                    0 /* flags */, task, task /* readyGroupRef */,
                    options.getRemoteTransition(), null /* displayChange */);
            startExistingRecentsIfPossibleInner(intent, options, r, task, rootTask);
            r.mTransitionController.moveToCollecting(transition);
            startExistingRecentsIfPossibleInner(options, r, rootTask, launchingState, remote,
                    transition);
        }
        return true;
    }

    void startExistingRecentsIfPossibleInner(Intent intent, ActivityOptions options,
            ActivityRecord r, Task task, Task rootTask) {
        final ActivityMetricsLogger.LaunchingState launchingState =
                mSupervisor.getActivityMetricsLogger().notifyActivityLaunching(intent);
    private void startExistingRecentsIfPossibleInner(ActivityOptions options, ActivityRecord r,
            Task rootTask, ActivityMetricsLogger.LaunchingState launchingState,
            RemoteTransition remoteTransition, Transition transition) {
        final Task task = r.getTask();
        mService.deferWindowLayout();
        try {
            r.mTransitionController.requestStartTransition(transition,
                    task, remoteTransition, null /* displayChange */);
            r.mTransitionController.collect(task);
            r.mTransitionController.setTransientLaunch(r,
                    TaskDisplayArea.getRootTaskAbove(rootTask));
            task.moveToFront("startExistingRecents");
+1 −1
Original line number Diff line number Diff line
@@ -1666,9 +1666,9 @@ class ActivityStarter {
                && transitionController.getTransitionPlayer() != null)
                ? transitionController.createTransition(TRANSIT_OPEN) : null;
        RemoteTransition remoteTransition = r.takeRemoteTransition();
        transitionController.collect(r);
        try {
            mService.deferWindowLayout();
            transitionController.collect(r);
            try {
                Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "startActivityInner");
                result = startActivityInner(r, sourceRecord, voiceSession, voiceInteractor,
+1 −1
Original line number Diff line number Diff line
@@ -345,7 +345,7 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe
        return mFinishTransaction;
    }

    private boolean isCollecting() {
    boolean isCollecting() {
        return mState == STATE_COLLECTING || mState == STATE_STARTED;
    }