From 7934a69c3af532dd990aaa218e3f58b1a469e84d Mon Sep 17 00:00:00 2001 From: Chris Li Date: Thu, 27 Jan 2022 17:27:32 +0800 Subject: [PATCH] Update APP_TRANSITION_STATE for Shell transition Before, when we have transition collecting or queueing, the app transition state may be IDLE, with which some flicker/cts tests may not wait until the previous action is finished. Fix: 216074588 Test: pass existing Change-Id: Ibfc91397cbf70500c16cf594d6a265c65df24ad9 --- .../core/java/com/android/server/wm/Transition.java | 2 +- .../com/android/server/wm/TransitionController.java | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/wm/Transition.java b/services/core/java/com/android/server/wm/Transition.java index 155db2c586542..d86382d1858f4 100644 --- a/services/core/java/com/android/server/wm/Transition.java +++ b/services/core/java/com/android/server/wm/Transition.java @@ -1328,7 +1328,7 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe } boolean getLegacyIsReady() { - return mState == STATE_STARTED && mSyncId >= 0 && mSyncEngine.isReady(mSyncId); + return (mState == STATE_STARTED || mState == STATE_COLLECTING) && mSyncId >= 0; } static Transition fromBinder(IBinder binder) { diff --git a/services/core/java/com/android/server/wm/TransitionController.java b/services/core/java/com/android/server/wm/TransitionController.java index 7a031db3a226f..60307ce220007 100644 --- a/services/core/java/com/android/server/wm/TransitionController.java +++ b/services/core/java/com/android/server/wm/TransitionController.java @@ -94,6 +94,9 @@ class TransitionController { // TODO(b/188595497): remove when not needed. final StatusBarManagerInternal mStatusBar; + /** Pending transitions from Shell that are waiting the SyncEngine to be free. */ + private final ArrayList mPendingTransitions = new ArrayList<>(); + TransitionController(ActivityTaskManagerService atm, TaskSnapshotController taskSnapshotController) { mAtm = atm; @@ -160,9 +163,11 @@ class TransitionController { } final PendingStartTransition out = new PendingStartTransition(new Transition(type, 0 /* flags */, this, mAtm.mWindowManager.mSyncEngine)); + mPendingTransitions.add(out); // We want to start collecting immediately when the engine is free, otherwise it may // be busy again. out.setStartSync(() -> { + mPendingTransitions.remove(out); moveToCollecting(out.mTransition); }); ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, "Creating PendingTransition: %s", @@ -530,7 +535,10 @@ class TransitionController { int state = LEGACY_STATE_IDLE; if (!mPlayingTransitions.isEmpty()) { state = LEGACY_STATE_RUNNING; - } else if (mCollectingTransition != null && mCollectingTransition.getLegacyIsReady()) { + } else if ((mCollectingTransition != null && mCollectingTransition.getLegacyIsReady()) + || !mPendingTransitions.isEmpty()) { + // The transition may not be "ready", but we have transition waiting to start, so it + // can't be IDLE for test purpose. Ideally, we should have a STATE_COLLECTING. state = LEGACY_STATE_READY; } proto.write(AppTransitionProto.APP_TRANSITION_STATE, state);