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

Commit 5ff76a1a authored by Tiger Huang's avatar Tiger Huang Committed by Android (Google) Code Review
Browse files

Merge "Revert "Re-land: Execute afterPrepareSurfacesRunnables after committing..."" into main

parents 2b3535b4 0498e5bc
Loading
Loading
Loading
Loading
+4 −27
Original line number Diff line number Diff line
@@ -556,37 +556,11 @@ class InsetsSourceProvider {
        }
        mControl = new InsetsSourceControl(mSource.getId(), mSource.getType(), leash,
                initiallyVisible, surfacePosition, getInsetsHint());
        mStateController.notifySurfaceTransactionReady(this, getSurfaceTransactionId(leash), true);

        ProtoLog.d(WM_DEBUG_WINDOW_INSETS,
                "InsetsSource Control %s for target %s", mControl, mControlTarget);
    }

    private long getSurfaceTransactionId(SurfaceControl leash) {
        // Here returns mNativeObject (long) as the ID instead of the leash itself so that
        // InsetsStateController won't keep referencing the leash unexpectedly.
        return leash != null ? leash.mNativeObject : 0;
    }

    /**
     * This is called when the surface transaction of the leash initialization has been committed.
     *
     * @param id Indicates which transaction is committed so that stale callbacks can be dropped.
     */
    void onSurfaceTransactionCommitted(long id) {
        if (mIsLeashReadyForDispatching) {
            return;
        }
        if (mControl == null) {
            return;
        }
        if (id != getSurfaceTransactionId(mControl.getLeash())) {
            return;
        }
        mIsLeashReadyForDispatching = true;
        mStateController.notifySurfaceTransactionReady(this, 0, false);
    }

    void startSeamlessRotation() {
        if (!mSeamlessRotating) {
            mSeamlessRotating = true;
@@ -608,6 +582,10 @@ class InsetsSourceProvider {
        return true;
    }

    void onSurfaceTransactionApplied() {
        mIsLeashReadyForDispatching = true;
    }

    void setClientVisible(boolean clientVisible) {
        if (mClientVisible == clientVisible) {
            return;
@@ -821,7 +799,6 @@ class InsetsSourceProvider {
        public void onAnimationCancelled(SurfaceControl animationLeash) {
            if (mAdapter == this) {
                mStateController.notifyControlRevoked(mControlTarget, InsetsSourceProvider.this);
                mStateController.notifySurfaceTransactionReady(InsetsSourceProvider.this, 0, false);
                mControl = null;
                mControlTarget = null;
                mAdapter = null;
+3 −23
Original line number Diff line number Diff line
@@ -34,7 +34,6 @@ import android.os.Trace;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.SparseArray;
import android.util.SparseLongArray;
import android.util.proto.ProtoOutputStream;
import android.view.InsetsSource;
import android.view.InsetsSourceControl;
@@ -60,7 +59,6 @@ class InsetsStateController {
    private final DisplayContent mDisplayContent;

    private final SparseArray<InsetsSourceProvider> mProviders = new SparseArray<>();
    private final SparseLongArray mSurfaceTransactionIds = new SparseLongArray();
    private final ArrayMap<InsetsControlTarget, ArrayList<InsetsSourceProvider>>
            mControlTargetProvidersMap = new ArrayMap<>();
    private final SparseArray<InsetsControlTarget> mIdControlTargetMap = new SparseArray<>();
@@ -378,32 +376,14 @@ class InsetsStateController {
        }
    }

    void notifySurfaceTransactionReady(InsetsSourceProvider provider, long id, boolean ready) {
        if (ready) {
            mSurfaceTransactionIds.put(provider.getSource().getId(), id);
        } else {
            mSurfaceTransactionIds.delete(provider.getSource().getId());
        }
    }

    private void notifyPendingInsetsControlChanged() {
        if (mPendingControlChanged.isEmpty()) {
            return;
        }
        final int size = mSurfaceTransactionIds.size();
        final SparseLongArray surfaceTransactionIds = new SparseLongArray(size);
        for (int i = 0; i < size; i++) {
            surfaceTransactionIds.append(
                    mSurfaceTransactionIds.keyAt(i), mSurfaceTransactionIds.valueAt(i));
        }
        mDisplayContent.mWmService.mAnimator.addAfterPrepareSurfacesRunnable(() -> {
            for (int i = 0; i < size; i++) {
                final int sourceId = surfaceTransactionIds.keyAt(i);
                final InsetsSourceProvider provider = mProviders.get(sourceId);
                if (provider == null) {
                    continue;
                }
                provider.onSurfaceTransactionCommitted(surfaceTransactionIds.valueAt(i));
            for (int i = mProviders.size() - 1; i >= 0; i--) {
                final InsetsSourceProvider provider = mProviders.valueAt(i);
                provider.onSurfaceTransactionApplied();
            }
            final ArraySet<InsetsControlTarget> newControlTargets = new ArraySet<>();
            int displayId = mDisplayContent.getDisplayId();
+28 −19
Original line number Diff line number Diff line
@@ -27,7 +27,6 @@ import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;

import android.content.Context;
import android.os.HandlerExecutor;
import android.os.Trace;
import android.util.Slog;
import android.util.TimeUtils;
@@ -69,8 +68,6 @@ public class WindowAnimator {

    private Choreographer mChoreographer;

    private final HandlerExecutor mExecutor;

    /**
     * Indicates whether we have an animation frame callback scheduled, which will happen at
     * vsync-app and then schedule the animation tick at the right time (vsync-sf).
@@ -82,7 +79,8 @@ public class WindowAnimator {
     * A list of runnable that need to be run after {@link WindowContainer#prepareSurfaces} is
     * executed and the corresponding transaction is closed and applied.
     */
    private ArrayList<Runnable> mAfterPrepareSurfacesRunnables = new ArrayList<>();
    private final ArrayList<Runnable> mAfterPrepareSurfacesRunnables = new ArrayList<>();
    private boolean mInExecuteAfterPrepareSurfacesRunnables;

    private final SurfaceControl.Transaction mTransaction;

@@ -93,7 +91,6 @@ public class WindowAnimator {
        mTransaction = service.mTransactionFactory.get();
        service.mAnimationHandler.runWithScissors(
                () -> mChoreographer = Choreographer.getSfInstance(), 0 /* timeout */);
        mExecutor = new HandlerExecutor(service.mAnimationHandler);

        mAnimationFrameCallback = frameTimeNs -> {
            synchronized (mService.mGlobalLock) {
@@ -201,19 +198,6 @@ public class WindowAnimator {
            updateRunningExpensiveAnimationsLegacy();
        }

        final ArrayList<Runnable> afterPrepareSurfacesRunnables = mAfterPrepareSurfacesRunnables;
        if (!afterPrepareSurfacesRunnables.isEmpty()) {
            mAfterPrepareSurfacesRunnables = new ArrayList<>();
            mTransaction.addTransactionCommittedListener(mExecutor, () -> {
                synchronized (mService.mGlobalLock) {
                    // Traverse in order they were added.
                    for (int i = 0, size = afterPrepareSurfacesRunnables.size(); i < size; i++) {
                        afterPrepareSurfacesRunnables.get(i).run();
                    }
                    afterPrepareSurfacesRunnables.clear();
                }
            });
        }
        Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "applyTransaction");
        mTransaction.apply();
        Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER);
@@ -221,6 +205,7 @@ public class WindowAnimator {
        ProtoLog.i(WM_SHOW_TRANSACTIONS, "<<< CLOSE TRANSACTION animate");

        mService.mAtmService.mTaskOrganizerController.dispatchPendingEvents();
        executeAfterPrepareSurfacesRunnables();

        if (DEBUG_WINDOW_TRACE) {
            Slog.i(TAG, "!!! animate: exit"
@@ -302,10 +287,34 @@ public class WindowAnimator {

    /**
     * Adds a runnable to be executed after {@link WindowContainer#prepareSurfaces} is called and
     * the corresponding transaction is closed, applied, and committed.
     * the corresponding transaction is closed and applied.
     */
    void addAfterPrepareSurfacesRunnable(Runnable r) {
        // If runnables are already being handled in executeAfterPrepareSurfacesRunnable, then just
        // immediately execute the runnable passed in.
        if (mInExecuteAfterPrepareSurfacesRunnables) {
            r.run();
            return;
        }

        mAfterPrepareSurfacesRunnables.add(r);
        scheduleAnimation();
    }

    void executeAfterPrepareSurfacesRunnables() {

        // Don't even think about to start recursing!
        if (mInExecuteAfterPrepareSurfacesRunnables) {
            return;
        }
        mInExecuteAfterPrepareSurfacesRunnables = true;

        // Traverse in order they were added.
        final int size = mAfterPrepareSurfacesRunnables.size();
        for (int i = 0; i < size; i++) {
            mAfterPrepareSurfacesRunnables.get(i).run();
        }
        mAfterPrepareSurfacesRunnables.clear();
        mInExecuteAfterPrepareSurfacesRunnables = false;
    }
}
+0 −10
Original line number Diff line number Diff line
@@ -40,19 +40,12 @@ import java.util.concurrent.Executor;
public class StubTransaction extends SurfaceControl.Transaction {

    private HashSet<Runnable> mWindowInfosReportedListeners = new HashSet<>();
    private HashSet<SurfaceControl.TransactionCommittedListener> mTransactionCommittedListeners =
            new HashSet<>();

    @Override
    public void apply() {
        for (Runnable listener : mWindowInfosReportedListeners) {
            listener.run();
        }
        for (SurfaceControl.TransactionCommittedListener listener
                : mTransactionCommittedListeners) {
            listener.onTransactionCommitted();
        }
        mTransactionCommittedListeners.clear();
    }

    @Override
@@ -246,9 +239,6 @@ public class StubTransaction extends SurfaceControl.Transaction {
    @Override
    public SurfaceControl.Transaction addTransactionCommittedListener(Executor executor,
            SurfaceControl.TransactionCommittedListener listener) {
        SurfaceControl.TransactionCommittedListener listenerInner =
                () -> executor.execute(listener::onTransactionCommitted);
        mTransactionCommittedListeners.add(listenerInner);
        return this;
    }

+12 −13
Original line number Diff line number Diff line
@@ -94,7 +94,6 @@ public class AppTransitionControllerTest extends WindowTestsBase {
    public void setUp() throws Exception {
        assumeFalse(WindowManagerService.sEnableShellTransitions);
        mAppTransitionController = new AppTransitionController(mWm, mDisplayContent);
        mWm.mAnimator.ready();
    }

    @Test
@@ -856,7 +855,7 @@ public class AppTransitionControllerTest extends WindowTestsBase {

        // Prepare and start transition.
        prepareAndTriggerAppTransition(activity, null /* closingActivity */, taskFragment);
        waitUntilWindowAnimatorIdle();
        mWm.mAnimator.executeAfterPrepareSurfacesRunnables();

        // Animation run by the remote handler.
        assertTrue(remoteAnimationRunner.isAnimationStarted());
@@ -887,7 +886,7 @@ public class AppTransitionControllerTest extends WindowTestsBase {
        // Prepare and start transition.
        prepareAndTriggerAppTransition(openingActivity, closingActivity,
                null /* changingTaskFragment */);
        waitUntilWindowAnimatorIdle();
        mWm.mAnimator.executeAfterPrepareSurfacesRunnables();

        // Animation is not run by the remote handler because the activity is filling the Task.
        assertFalse(remoteAnimationRunner.isAnimationStarted());
@@ -922,7 +921,7 @@ public class AppTransitionControllerTest extends WindowTestsBase {
        // Prepare and start transition.
        prepareAndTriggerAppTransition(openingActivity, closingActivity,
                null /* changingTaskFragment */);
        waitUntilWindowAnimatorIdle();
        mWm.mAnimator.executeAfterPrepareSurfacesRunnables();

        // Animation run by the remote handler.
        assertTrue(remoteAnimationRunner.isAnimationStarted());
@@ -947,7 +946,7 @@ public class AppTransitionControllerTest extends WindowTestsBase {

        // Prepare and start transition.
        prepareAndTriggerAppTransition(openingActivity, closingActivity, taskFragment);
        waitUntilWindowAnimatorIdle();
        mWm.mAnimator.executeAfterPrepareSurfacesRunnables();

        // Animation run by the remote handler.
        assertTrue(remoteAnimationRunner.isAnimationStarted());
@@ -974,7 +973,7 @@ public class AppTransitionControllerTest extends WindowTestsBase {

        // Prepare and start transition.
        prepareAndTriggerAppTransition(openingActivity, closingActivity, taskFragment1);
        waitUntilWindowAnimatorIdle();
        mWm.mAnimator.executeAfterPrepareSurfacesRunnables();

        // Animation run by the remote handler.
        assertTrue(remoteAnimationRunner.isAnimationStarted());
@@ -998,7 +997,7 @@ public class AppTransitionControllerTest extends WindowTestsBase {

        // Prepare and start transition.
        prepareAndTriggerAppTransition(openingActivity, closingActivity, taskFragment);
        waitUntilWindowAnimatorIdle();
        mWm.mAnimator.executeAfterPrepareSurfacesRunnables();

        // Animation not run by the remote handler.
        assertFalse(remoteAnimationRunner.isAnimationStarted());
@@ -1025,7 +1024,7 @@ public class AppTransitionControllerTest extends WindowTestsBase {

        // Prepare and start transition.
        prepareAndTriggerAppTransition(openingActivity, closingActivity, taskFragment);
        waitUntilWindowAnimatorIdle();
        mWm.mAnimator.executeAfterPrepareSurfacesRunnables();

        // Animation should not run by the remote handler when there are non-embedded activities of
        // different UID.
@@ -1052,7 +1051,7 @@ public class AppTransitionControllerTest extends WindowTestsBase {

        // Prepare and start transition.
        prepareAndTriggerAppTransition(activity, null /* closingActivity */, taskFragment);
        waitUntilWindowAnimatorIdle();
        mWm.mAnimator.executeAfterPrepareSurfacesRunnables();

        // Animation should not run by the remote handler when there is wallpaper in the transition.
        assertFalse(remoteAnimationRunner.isAnimationStarted());
@@ -1086,7 +1085,7 @@ public class AppTransitionControllerTest extends WindowTestsBase {

        // Prepare and start transition.
        prepareAndTriggerAppTransition(activity1, null /* closingActivity */, taskFragment);
        waitUntilWindowAnimatorIdle();
        mWm.mAnimator.executeAfterPrepareSurfacesRunnables();

        // The animation will be animated remotely by client and all activities are input disabled
        // for untrusted animation.
@@ -1137,7 +1136,7 @@ public class AppTransitionControllerTest extends WindowTestsBase {

        // Prepare and start transition.
        prepareAndTriggerAppTransition(activity, null /* closingActivity */, taskFragment);
        waitUntilWindowAnimatorIdle();
        mWm.mAnimator.executeAfterPrepareSurfacesRunnables();

        // The animation will be animated remotely by client and all activities are input disabled
        // for untrusted animation.
@@ -1179,7 +1178,7 @@ public class AppTransitionControllerTest extends WindowTestsBase {

        // Prepare and start transition.
        prepareAndTriggerAppTransition(activity, null /* closingActivity */, taskFragment);
        waitUntilWindowAnimatorIdle();
        mWm.mAnimator.executeAfterPrepareSurfacesRunnables();

        // The animation will be animated remotely by client, but input should not be dropped for
        // fully trusted.
Loading