diff options
| -rw-r--r-- | services/core/java/com/android/server/wm/AppWindowToken.java | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java index 1086eb2ceaad..f859fd2e44bb 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 @@ class AppWindowToken extends WindowToken { @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); } } |