diff --git a/services/core/java/com/android/server/wm/ActivityStartController.java b/services/core/java/com/android/server/wm/ActivityStartController.java index a7883cbd068c6..5e066faf0e90a 100644 --- a/services/core/java/com/android/server/wm/ActivityStartController.java +++ b/services/core/java/com/android/server/wm/ActivityStartController.java @@ -605,11 +605,16 @@ public class ActivityStartController { 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)); + final TransitionController controller = r.mTransitionController; + if (controller.getTransitionPlayer() != null) { + controller.requestStartTransition(transition, task, remoteTransition, + null /* displayChange */); + controller.collect(task); + controller.setTransientLaunch(r, TaskDisplayArea.getRootTaskAbove(rootTask)); + } else { + // The transition player might be died when executing the queued transition. + transition.abort(); + } task.moveToFront("startExistingRecents"); task.mInResumeTopActivity = true; task.resumeTopActivity(null /* prev */, options, true /* deferPause */); diff --git a/services/core/java/com/android/server/wm/DisplayRotation.java b/services/core/java/com/android/server/wm/DisplayRotation.java index 7071aa728230b..c0817250bd146 100644 --- a/services/core/java/com/android/server/wm/DisplayRotation.java +++ b/services/core/java/com/android/server/wm/DisplayRotation.java @@ -635,7 +635,8 @@ public class DisplayRotation { if (mDisplayContent.mTransitionController.isShellTransitionsEnabled()) { if (!mDisplayContent.mTransitionController.isCollecting()) { - throw new IllegalStateException("Trying to rotate outside a transition"); + // The remote may be too slow to response before transition timeout. + Slog.e(TAG, "Trying to continue rotation outside a transition"); } mDisplayContent.mTransitionController.collect(mDisplayContent); } diff --git a/services/core/java/com/android/server/wm/Transition.java b/services/core/java/com/android/server/wm/Transition.java index e1a144a39e573..71bb99cbf5154 100644 --- a/services/core/java/com/android/server/wm/Transition.java +++ b/services/core/java/com/android/server/wm/Transition.java @@ -427,7 +427,10 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { if (mState < STATE_COLLECTING) { throw new IllegalStateException("Can't start Transition which isn't collecting."); } else if (mState >= STATE_STARTED) { - Slog.w(TAG, "Transition already started: " + mSyncId); + Slog.w(TAG, "Transition already started id=" + mSyncId + " state=" + mState); + // The transition may be aborted (STATE_ABORT) or timed out (STATE_PLAYING by + // SyncGroup#finishNow), so do not revert the state to STATE_STARTED. + return; } mState = STATE_STARTED; ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, "Starting Transition %d",