Fix ActivityRecord leak if mainWindow is animating.

For CTS test, sometimes remove starting window won't pass throught
WS#removeIfPossible if the binder was dead before reveal animation
finish. For this case, cancel reveal animation in WS#removeIfPossible
if it's animating reveal animation.

Bug: 184830058
Bug: 188245125
Bug: 188244674
Test: verify from bugreport that no systemui crash after WM's CTS.
Test: run atest StartActivityTests then verify no activity leaked.
Change-Id: I81484870ff89a78b6133be03d439d45d550bdd8c
This commit is contained in:
wilsonshih
2021-05-14 17:41:19 +08:00
committed by Wei Sheng Shih
parent c73c098665
commit 5e49e12bb2

View File

@@ -2409,18 +2409,22 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
final boolean startingWindow = mAttrs.type == TYPE_APPLICATION_STARTING;
if (startingWindow) {
ProtoLog.d(WM_DEBUG_STARTING_WINDOW, "Starting window removed %s", this);
}
if (startingWindow && StartingSurfaceController.DEBUG_ENABLE_SHELL_DRAWER) {
// Cancel the remove starting window animation on shell. The main window might changed
// during animating, checking for all windows would be safer.
if (mActivityRecord != null) {
mActivityRecord.forAllWindows(w -> {
mActivityRecord.forAllWindowsUnchecked(w -> {
if (w.isSelfAnimating(0, ANIMATION_TYPE_STARTING_REVEAL)) {
w.cancelAnimation();
return true;
}
return false;
}, true);
}
} else if (mAttrs.type == TYPE_BASE_APPLICATION
&& isSelfAnimating(0, ANIMATION_TYPE_STARTING_REVEAL)) {
// Cancel the remove starting window animation in case the binder dead before remove
// splash window.
cancelAnimation();
}
ProtoLog.v(WM_DEBUG_FOCUS, "Remove client=%x, surfaceController=%s Callers=%s",
@@ -2428,7 +2432,6 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
mWinAnimator.mSurfaceController,
Debug.getCallers(5));
final long origId = Binder.clearCallingIdentity();
try {