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

Commit f9f91bfd authored by Riddle Hsu's avatar Riddle Hsu
Browse files

Preset remote animation proc for transient launch

So RecentsTransitionHandler#startAnimation ->
setRunningRemoteTransitionDelegate doesn't need to enter wm lock.
That can avoid the latency to notify IRecentsAnimationRunner#
onAnimationStart, e.g. if it is not preset, the set-running-remote
may be blocked by surface placement for several milliseconds.

Reference: I137fcdff3cb5658aad5f7452c33bbc8d70f42398

Bug: 275508603
Test: TransitionTests

Change-Id: Ifa772d7576c42163af2c64a14cee684d117c0b43
parent 6d344862
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -574,7 +574,9 @@ public class ActivityStartController {
        mService.deferWindowLayout();
        try {
            final TransitionController controller = r.mTransitionController;
            if (controller.getTransitionPlayer() != null) {
            final Transition transition = controller.getCollectingTransition();
            if (transition != null) {
                transition.setRemoteAnimationApp(r.app.getThread());
                controller.collect(task);
                controller.setTransientLaunch(r, TaskDisplayArea.getRootTaskAbove(rootTask));
            }
+7 −6
Original line number Diff line number Diff line
@@ -66,6 +66,7 @@ import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ActivityManager;
import android.app.IApplicationThread;
import android.content.pm.ActivityInfo;
import android.graphics.Point;
import android.graphics.Rect;
@@ -83,7 +84,6 @@ import android.util.SparseArray;
import android.view.Display;
import android.view.SurfaceControl;
import android.view.WindowManager;
import android.window.RemoteTransition;
import android.window.ScreenCapture;
import android.window.TransitionInfo;

@@ -160,7 +160,7 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener {
    private final TransitionController mController;
    private final BLASTSyncEngine mSyncEngine;
    private final Token mToken;
    private RemoteTransition mRemoteTransition = null;
    private IApplicationThread mRemoteAnimApp;

    /** Only use for clean-up after binder death! */
    private SurfaceControl.Transaction mStartTransaction = null;
@@ -1075,12 +1075,13 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener {
        return mForcePlaying;
    }

    void setRemoteTransition(RemoteTransition remoteTransition) {
        mRemoteTransition = remoteTransition;
    void setRemoteAnimationApp(IApplicationThread app) {
        mRemoteAnimApp = app;
    }

    RemoteTransition getRemoteTransition() {
        return mRemoteTransition;
    /** Returns the app which will run the transition animation. */
    IApplicationThread getRemoteAnimationApp() {
        return mRemoteAnimApp;
    }

    void setNoAnimation(WindowContainer wc) {
+5 −4
Original line number Diff line number Diff line
@@ -549,7 +549,9 @@ class TransitionController {
            transition.mLogger.mRequestTimeNs = SystemClock.elapsedRealtimeNanos();
            transition.mLogger.mRequest = request;
            mTransitionPlayer.requestStartTransition(transition.getToken(), request);
            transition.setRemoteTransition(remoteTransition);
            if (remoteTransition != null) {
                transition.setRemoteAnimationApp(remoteTransition.getAppThread());
            }
        } catch (RemoteException e) {
            Slog.e(TAG, "Error requesting transition", e);
            transition.start();
@@ -761,9 +763,8 @@ class TransitionController {
            mRemotePlayer.clear();
            return;
        }
        final RemoteTransition remote = transition.getRemoteTransition();
        if (remote == null) return;
        final IApplicationThread appThread = remote.getAppThread();
        final IApplicationThread appThread = transition.getRemoteAnimationApp();
        if (appThread == null || appThread == mTransitionPlayerProc.getThread()) return;
        final WindowProcessController delegate = mAtm.getProcessController(appThread);
        if (delegate == null) return;
        mRemotePlayer.update(delegate, isPlaying, true /* predict */);