Merge "Don't leak windows on removal with dummy animations" into mnc-dev

This commit is contained in:
Android (Google) Code Review
2015-06-04 17:30:05 +00:00
2 changed files with 16 additions and 5 deletions

View File

@@ -2734,14 +2734,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();
@@ -2757,7 +2759,6 @@ public class WindowManagerService extends IWindowManager.Stub
if (focusChanged) {
mInputMonitor.updateInputWindowsLw(false /*force*/);
}
//dump();
Binder.restoreCallingIdentity(origId);
return;
}

View File

@@ -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();