am 117f0c15: am 25418aab: Merge "Ensure arraylist index is montonically decreasing" into lmp-mr1-dev automerge: 9bb16f5

* commit '117f0c15f7d534afeed20d8e14be8a83f8062f72':
  Ensure arraylist index is montonically decreasing
diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java
index 1086eb2..f859fd2 100644
--- a/services/core/java/com/android/server/wm/AppWindowToken.java
+++ b/services/core/java/com/android/server/wm/AppWindowToken.java
@@ -254,15 +254,18 @@
 
     @Override
     void removeAllWindows() {
-        int winNdx;
-        while ((winNdx = allAppWindows.size()) > 0) {
-            WindowState win = allAppWindows.get(winNdx - 1);
+        for (int winNdx = allAppWindows.size() - 1; winNdx >= 0;
+                // removeWindowLocked at bottom of loop may remove multiple entries from
+                // allAppWindows if the window to be removed has child windows. It also may
+                // not remove any windows from allAppWindows at all if win is exiting and
+                // currently animating away. This ensures that winNdx is monotonically decreasing
+                // and never beyond allAppWindows bounds.
+                winNdx = Math.min(winNdx - 1, allAppWindows.size() - 1)) {
+            WindowState win = allAppWindows.get(winNdx);
             if (WindowManagerService.DEBUG_WINDOW_MOVEMENT) {
                 Slog.w(WindowManagerService.TAG, "removeAllWindows: removing win=" + win);
             }
 
-            // {@link WindowManagerService.removeWindowLocked} may remove multiple entries from
-            // {@link #allAppWindows} if the window to be removed has child windows.
             win.mService.removeWindowLocked(win.mSession, win);
         }
     }