Loading services/core/java/com/android/server/wm/Transition.java +4 −0 Original line number Diff line number Diff line Loading @@ -709,6 +709,10 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { return mState == STATE_STARTED; } boolean hasStarted() { return mState >= STATE_STARTED; } boolean isPlaying() { return mState == STATE_PLAYING; } Loading services/core/java/com/android/server/wm/TransitionController.java +23 −1 Original line number Diff line number Diff line Loading @@ -175,6 +175,7 @@ class TransitionController { final Transition mTransition; final OnStartCollect mOnStartCollect; final BLASTSyncEngine.SyncGroup mLegacySync; boolean mShouldNoopUponDequeue; QueuedTransition(Transition transition, OnStartCollect onStartCollect) { mTransition = transition; Loading Loading @@ -1171,6 +1172,14 @@ class TransitionController { // do collect things it can cause problems). So, we need to run it's onCollectStarted // immediately. queued.mOnStartCollect.onCollectStarted(true /* deferred */); } else if (queued.mTransition != null && queued.mShouldNoopUponDequeue) { // This transition was queued at a time when the collecting transition might have left // the incoming transition's changes stale (e.g. display change transition had not // been formally started). So send this transition to Shell before applying any changes // to report it as a no-op. ProtoLog.w(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS_MIN, "Formerly queued #%d force-reported as no-op", queued.mTransition.getSyncId()); queued.mTransition.setAllReady(); } else { // Post this so that the now-playing transition logic isn't interrupted. mAtm.mH.post(() -> { Loading Loading @@ -1502,7 +1511,20 @@ class TransitionController { /** Returns {@code true} if it started collecting, {@code false} if it was queued. */ private void queueTransition(Transition transit, OnStartCollect onStartCollect) { mQueuedTransitions.add(new QueuedTransition(transit, onStartCollect)); final QueuedTransition queuedTransition = new QueuedTransition(transit, onStartCollect); // If we queue a transition while a collecting transition is still not formally started, // then check if collecting transition is changing a display if (mCollectingTransition != null && !mCollectingTransition.hasStarted()) { for (int i = 0; i < mCollectingTransition.mParticipants.size(); i++) { if (mCollectingTransition.mParticipants.valueAt(i).asDisplayContent() != null) { queuedTransition.mShouldNoopUponDequeue = true; break; } } } mQueuedTransitions.add(queuedTransition); ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS_MIN, "Queueing transition: %s", transit); } Loading Loading
services/core/java/com/android/server/wm/Transition.java +4 −0 Original line number Diff line number Diff line Loading @@ -709,6 +709,10 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { return mState == STATE_STARTED; } boolean hasStarted() { return mState >= STATE_STARTED; } boolean isPlaying() { return mState == STATE_PLAYING; } Loading
services/core/java/com/android/server/wm/TransitionController.java +23 −1 Original line number Diff line number Diff line Loading @@ -175,6 +175,7 @@ class TransitionController { final Transition mTransition; final OnStartCollect mOnStartCollect; final BLASTSyncEngine.SyncGroup mLegacySync; boolean mShouldNoopUponDequeue; QueuedTransition(Transition transition, OnStartCollect onStartCollect) { mTransition = transition; Loading Loading @@ -1171,6 +1172,14 @@ class TransitionController { // do collect things it can cause problems). So, we need to run it's onCollectStarted // immediately. queued.mOnStartCollect.onCollectStarted(true /* deferred */); } else if (queued.mTransition != null && queued.mShouldNoopUponDequeue) { // This transition was queued at a time when the collecting transition might have left // the incoming transition's changes stale (e.g. display change transition had not // been formally started). So send this transition to Shell before applying any changes // to report it as a no-op. ProtoLog.w(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS_MIN, "Formerly queued #%d force-reported as no-op", queued.mTransition.getSyncId()); queued.mTransition.setAllReady(); } else { // Post this so that the now-playing transition logic isn't interrupted. mAtm.mH.post(() -> { Loading Loading @@ -1502,7 +1511,20 @@ class TransitionController { /** Returns {@code true} if it started collecting, {@code false} if it was queued. */ private void queueTransition(Transition transit, OnStartCollect onStartCollect) { mQueuedTransitions.add(new QueuedTransition(transit, onStartCollect)); final QueuedTransition queuedTransition = new QueuedTransition(transit, onStartCollect); // If we queue a transition while a collecting transition is still not formally started, // then check if collecting transition is changing a display if (mCollectingTransition != null && !mCollectingTransition.hasStarted()) { for (int i = 0; i < mCollectingTransition.mParticipants.size(); i++) { if (mCollectingTransition.mParticipants.valueAt(i).asDisplayContent() != null) { queuedTransition.mShouldNoopUponDequeue = true; break; } } } mQueuedTransitions.add(queuedTransition); ProtoLog.v(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS_MIN, "Queueing transition: %s", transit); } Loading