From f9f91bfd2e833ee25f00482960fe20c150dd8233 Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Tue, 28 Mar 2023 21:51:26 +0800 Subject: [PATCH] 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 --- .../android/server/wm/ActivityStartController.java | 4 +++- .../core/java/com/android/server/wm/Transition.java | 13 +++++++------ .../com/android/server/wm/TransitionController.java | 9 +++++---- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/services/core/java/com/android/server/wm/ActivityStartController.java b/services/core/java/com/android/server/wm/ActivityStartController.java index f8fb76acf81e4..7c1e9071b9262 100644 --- a/services/core/java/com/android/server/wm/ActivityStartController.java +++ b/services/core/java/com/android/server/wm/ActivityStartController.java @@ -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)); } diff --git a/services/core/java/com/android/server/wm/Transition.java b/services/core/java/com/android/server/wm/Transition.java index 2cfd2af89c801..68dfbbb9fa195 100644 --- a/services/core/java/com/android/server/wm/Transition.java +++ b/services/core/java/com/android/server/wm/Transition.java @@ -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) { diff --git a/services/core/java/com/android/server/wm/TransitionController.java b/services/core/java/com/android/server/wm/TransitionController.java index f314b21a0d726..2137c4653441b 100644 --- a/services/core/java/com/android/server/wm/TransitionController.java +++ b/services/core/java/com/android/server/wm/TransitionController.java @@ -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 */);