From 33fde7d098d6fb68bfacc390f5f5a2cf865a203b Mon Sep 17 00:00:00 2001 From: Wale Ogunwale Date: Sat, 5 Mar 2016 22:38:51 -0800 Subject: [PATCH] Fixed IndexOutOfBoundsException when removing child windows The size of the list reduces when a child window is removed from the list. So, we copy the window list and loop from the last entry to the first when removing to avoid IndexOutOfBoundsException. Bug: 27345523 Change-Id: I15986e418d29ee5035dc9d4c4f728ad33bfe6999 --- .../core/java/com/android/server/wm/WindowState.java | 4 ++++ .../java/com/android/server/wm/WindowStateAnimator.java | 9 ++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 4ad021e1c00c8..617d2b4d28e3a 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -101,6 +101,10 @@ import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; class WindowList extends ArrayList { + WindowList() {} + WindowList(WindowList windowList) { + super(windowList); + } } /** diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java index c1ff96e72ae57..bf8a62e5787de 100644 --- a/services/core/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java @@ -434,9 +434,12 @@ class WindowStateAnimator { + " remove=" + mWin.mRemoveOnExit + " windowAnimating=" + isWindowAnimating()); - final int N = mWin.mChildWindows.size(); - for (int i=0; i= 0; i--) { + childWindows.get(i).mWinAnimator.finishExit(); + } } if (mEnteringAnimation) {