From 01f79cf91610ec9f85345ea6eeae50ea2f28578f Mon Sep 17 00:00:00 2001 From: Craig Mautner Date: Wed, 27 Aug 2014 09:56:02 -0700 Subject: [PATCH] When adding an apptoken skip over removed ones. App tokens are passed from the activity manager to the window manager along with a list insertion position. That insertion position presumes that all removed tokens are no longer in window manager's list. However, when removal of a token is delayed due to ongoing animation the insertion position was pointing to the wrong location. This fix skips over tokens that have been marked for removal when inserting new app tokens. Fixes bug 15751591. Change-Id: Ib484c591e2bba9f46ad8e47d60ef05c7bfda0a12 --- services/core/java/com/android/server/wm/Task.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 09c4e20b6d5aa..9ceac41a8bcaf 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -41,11 +41,11 @@ class Task { void addAppToken(int addPos, AppWindowToken wtoken) { final int lastPos = mAppTokens.size(); - if (addPos > lastPos) { - // We lost an app token. Don't crash though. - Slog.e(TAG, "Task.addAppToken: Out of bounds attempt token=" + wtoken + " addPos=" - + addPos + " lastPos=" + lastPos); - addPos = lastPos; + for (int pos = 0; pos < lastPos && pos < addPos; ++pos) { + if (mAppTokens.get(pos).removed) { + // addPos assumes removed tokens are actually gone. + ++addPos; + } } mAppTokens.add(addPos, wtoken); mDeferRemoval = false;