Fix clean-up order when player crashes
If the player crashes, its binder death will trigger some clean-up.
There was a bug in the clean-up code though since the clean-up
routines on these objects can also remove themselves from the iterating
list. This reverses the iteration order.
Bug: 304929146
Test: crash sysui with >1 queued transitions
Change-Id: Icbee54a6f72ee110216fc11ea88b8ef93e3a9c0e
diff --git a/services/core/java/com/android/server/wm/TransitionController.java b/services/core/java/com/android/server/wm/TransitionController.java
index c134464..1f01778 100644
--- a/services/core/java/com/android/server/wm/TransitionController.java
+++ b/services/core/java/com/android/server/wm/TransitionController.java
@@ -271,13 +271,14 @@
if (mTransitionPlayer == null) return;
// Immediately set to null so that nothing inadvertently starts/queues.
mTransitionPlayer = null;
- // Clean-up/finish any playing transitions.
- for (int i = 0; i < mPlayingTransitions.size(); ++i) {
+ // Clean-up/finish any playing transitions. Backwards since they can remove themselves.
+ for (int i = mPlayingTransitions.size() - 1; i >= 0; --i) {
mPlayingTransitions.get(i).cleanUpOnFailure();
}
mPlayingTransitions.clear();
// Clean up waiting transitions first since they technically started first.
- for (int i = 0; i < mWaitingTransitions.size(); ++i) {
+ // Backwards since they can remove themselves.
+ for (int i = mWaitingTransitions.size() - 1; i >= 0; --i) {
mWaitingTransitions.get(i).abort();
}
mWaitingTransitions.clear();