summaryrefslogtreecommitdiffstats
path: root/services/core/java/com/android/server/wm
diff options
context:
space:
mode:
authorStefan Kuhne <skuhne@google.com>2015-06-03 14:45:26 -0700
committerStefan Kuhne <skuhne@google.com>2015-06-04 10:28:07 -0700
commit79f4718d7cb7e4a7b43dff9618bd4edd884ed6de (patch)
tree1d0e4d9839250ce75a653a5781074b9b3bf39dc4 /services/core/java/com/android/server/wm
parent9be801c8269358ded8e4bed6103ca2346da7e179 (diff)
downloadframeworks_base-79f4718d7cb7e4a7b43dff9618bd4edd884ed6de.zip
frameworks_base-79f4718d7cb7e4a7b43dff9618bd4edd884ed6de.tar.gz
frameworks_base-79f4718d7cb7e4a7b43dff9618bd4edd884ed6de.tar.bz2
Don't leak windows on removal with dummy animations
Dummy animations might never end. Do not hold a window removal for it. Bug: 21403998 Change-Id: Ie907d31f51e130e245a70249a983d490f3d42b21
Diffstat (limited to 'services/core/java/com/android/server/wm')
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java9
-rw-r--r--services/core/java/com/android/server/wm/WindowStateAnimator.java12
2 files changed, 16 insertions, 5 deletions
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 5c9f87e..bd2e002 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -2724,14 +2724,16 @@ public class WindowManagerService extends IWindowManager.Stub
}
}
final AppWindowToken appToken = win.mAppToken;
+ // Prevent an immediate window exit only for a real animation, ignoring e.g.
+ // dummy animations.
+ final boolean inAnimation = win.mWinAnimator.isWindowAnimatingNow();
// The starting window is the last window in this app token and it isn't animating.
// Allow it to be removed now as there is no additional window or animation that will
// trigger its removal.
final boolean lastWinStartingNotAnimating = startingWindow && appToken!= null
- && appToken.allAppWindows.size() == 1 && !win.mWinAnimator.isWindowAnimating();
- if (!lastWinStartingNotAnimating && (win.mExiting || win.mWinAnimator.isAnimating())) {
+ && appToken.allAppWindows.size() == 1 && !inAnimation;
+ if (!lastWinStartingNotAnimating && (win.mExiting || inAnimation)) {
// The exit animation is running... wait for it!
- //Slog.i(TAG, "*** Running exit animation...");
win.mExiting = true;
win.mRemoveOnExit = true;
final DisplayContent displayContent = win.getDisplayContent();
@@ -2747,7 +2749,6 @@ public class WindowManagerService extends IWindowManager.Stub
if (focusChanged) {
mInputMonitor.updateInputWindowsLw(false /*force*/);
}
- //dump();
Binder.restoreCallingIdentity(origId);
return;
}
diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java
index e9023fd..b42c8eb 100644
--- a/services/core/java/com/android/server/wm/WindowStateAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java
@@ -251,11 +251,21 @@ class WindowStateAnimator {
&& mAppAnimator.animation == AppWindowAnimator.sDummyAnimation;
}
- /** Is this window currently animating? */
+ /** Is this window currently set to animate or currently animating?
+ * NOTE: The method will return true for cases where the window isn't currently animating, but
+ * is set to animate. i.e. if the window animation is currently set to a dummy placeholder
+ * animation. Use {@link #isWindowAnimatingNow} to know if the window is currently running a
+ * real animation. */
boolean isWindowAnimating() {
return mAnimation != null;
}
+ /** Is the window performing a real animation and not a dummy which is only waiting for an
+ * an animation to start? */
+ boolean isWindowAnimatingNow() {
+ return isWindowAnimating() && !isDummyAnimation();
+ }
+
void cancelExitAnimationForNextAnimationLocked() {
if (mAnimation != null) {
mAnimation.cancel();