diff --git a/services/core/java/com/android/server/wm/RemoteAnimationController.java b/services/core/java/com/android/server/wm/RemoteAnimationController.java index c353c1d36d600..ae0f412a99bbd 100644 --- a/services/core/java/com/android/server/wm/RemoteAnimationController.java +++ b/services/core/java/com/android/server/wm/RemoteAnimationController.java @@ -96,13 +96,17 @@ class RemoteAnimationController { // Scale the timeout with the animator scale the controlling app is using. mHandler.postDelayed(mTimeoutRunnable, (long) (TIMEOUT_MS * mService.getCurrentAnimatorScale())); - try { - mRemoteAnimationAdapter.getRunner().onAnimationStart(createAnimations(), - mFinishedCallback); - } catch (RemoteException e) { - Slog.e(TAG, "Failed to start remote animation", e); - onAnimationFinished(); - } + + final RemoteAnimationTarget[] animations = createAnimations(); + mService.mAnimator.addAfterPrepareSurfacesRunnable(() -> { + try { + mRemoteAnimationAdapter.getRunner().onAnimationStart(animations, + mFinishedCallback); + } catch (RemoteException e) { + Slog.e(TAG, "Failed to start remote animation", e); + onAnimationFinished(); + } + }); } private RemoteAnimationTarget[] createAnimations() { diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index b6b0b448ff381..2fe55b9ec1177 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -588,6 +588,8 @@ class RootWindowContainer extends WindowContainer { "<<< CLOSE TRANSACTION performLayoutAndPlaceSurfaces"); } + mService.mAnimator.executeAfterPrepareSurfacesRunnables(); + final WindowSurfacePlacer surfacePlacer = mService.mWindowPlacerLocked; // If we are ready to perform an app transition, check through all of the app tokens to be diff --git a/services/core/java/com/android/server/wm/WindowAnimator.java b/services/core/java/com/android/server/wm/WindowAnimator.java index 8f9a1bf05cd8b..ab1019779b0b5 100644 --- a/services/core/java/com/android/server/wm/WindowAnimator.java +++ b/services/core/java/com/android/server/wm/WindowAnimator.java @@ -92,6 +92,7 @@ public class WindowAnimator { * executed and the corresponding transaction is closed and applied. */ private final ArrayList mAfterPrepareSurfacesRunnables = new ArrayList<>(); + private boolean mInExecuteAfterPrepareSurfacesRunnables; WindowAnimator(final WindowManagerService service) { mService = service; @@ -426,11 +427,24 @@ public class WindowAnimator { * 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(); } - private void executeAfterPrepareSurfacesRunnables() { + 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(); @@ -438,5 +452,6 @@ public class WindowAnimator { mAfterPrepareSurfacesRunnables.get(i).run(); } mAfterPrepareSurfacesRunnables.clear(); + mInExecuteAfterPrepareSurfacesRunnables = false; } }