Merge "Don't remove all app token windows when window client dies" into nyc-dev

This commit is contained in:
TreeHugger Robot
2016-05-03 01:46:56 +00:00
committed by Android (Google) Code Review
4 changed files with 29 additions and 27 deletions

View File

@@ -109,7 +109,6 @@ class AppWindowToken extends WindowToken {
// Set to true when the token has been removed from the window mgr.
boolean removed;
boolean appDied;
// Information about an application starting window if displayed.
StartingData startingData;
WindowState startingWindow;
@@ -458,12 +457,12 @@ class AppWindowToken extends WindowToken {
void removeAllDeadWindows() {
for (int winNdx = allAppWindows.size() - 1; winNdx >= 0;
// removeWindowLocked at bottom of loop may remove multiple entries from
// allAppWindows if the window to be removed has child windows. It also may
// not remove any windows from allAppWindows at all if win is exiting and
// currently animating away. This ensures that winNdx is monotonically decreasing
// and never beyond allAppWindows bounds.
winNdx = Math.min(winNdx - 1, allAppWindows.size() - 1)) {
// removeWindowLocked at bottom of loop may remove multiple entries from
// allAppWindows if the window to be removed has child windows. It also may
// not remove any windows from allAppWindows at all if win is exiting and
// currently animating away. This ensures that winNdx is monotonically decreasing
// and never beyond allAppWindows bounds.
winNdx = Math.min(winNdx - 1, allAppWindows.size() - 1)) {
WindowState win = allAppWindows.get(winNdx);
if (win.mAppDied) {
if (DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) {
@@ -476,6 +475,15 @@ class AppWindowToken extends WindowToken {
}
}
boolean hasWindowsAlive() {
for (int i = allAppWindows.size() - 1; i >= 0; i--) {
if (!allAppWindows.get(i).mAppDied) {
return true;
}
}
return false;
}
void setReplacingWindows(boolean animate) {
if (DEBUG_ADD_REMOVE) Slog.d(TAG_WM, "Marking app token " + appWindowToken
+ " with replacing windows.");

View File

@@ -125,9 +125,9 @@ class Task implements DimLayer.DimLayerUser {
mHomeTask = homeTask;
}
private boolean hasAppTokensAlive() {
private boolean hasWindowsAlive() {
for (int i = mAppTokens.size() - 1; i >= 0; i--) {
if (!mAppTokens.get(i).appDied) {
if (mAppTokens.get(i).hasWindowsAlive()) {
return true;
}
}
@@ -135,7 +135,7 @@ class Task implements DimLayer.DimLayerUser {
}
void removeLocked() {
if (hasAppTokensAlive() && mStack.isAnimating()) {
if (hasWindowsAlive() && mStack.isAnimating()) {
if (DEBUG_STACK) Slog.i(TAG, "removeTask: deferring removing taskId=" + mTaskId);
mDeferRemoval = true;
return;

View File

@@ -2000,11 +2000,6 @@ public class WindowManagerService extends IWindowManager.Stub
return WindowManagerGlobal.ADD_INVALID_DISPLAY;
}
if (atoken != null && atoken.appDied) {
Slog.d(TAG_WM, "App is now revived: " + atoken);
atoken.appDied = false;
}
mPolicy.adjustWindowParamsLw(win.mAttrs);
win.setShowToOwnerOnlyLocked(mPolicy.checkShowToOwnerOnly(attrs));
@@ -2260,6 +2255,10 @@ public class WindowManagerService extends IWindowManager.Stub
}
void removeWindowLocked(WindowState win) {
removeWindowLocked(win, false);
}
void removeWindowLocked(WindowState win, boolean keepVisibleDeadWindow) {
win.mWindowRemovalAllowed = true;
if (DEBUG_ADD_REMOVE) Slog.v(TAG,
"removeWindowLocked: " + win + " callers=" + Debug.getCallers(4));
@@ -2317,7 +2316,7 @@ public class WindowManagerService extends IWindowManager.Stub
// If we are not currently running the exit animation, we need to see about starting one
wasVisible = win.isWinVisibleLw();
if (win.shouldKeepVisibleDeadAppWindow()) {
if (keepVisibleDeadWindow) {
if (DEBUG_ADD_REMOVE) Slog.v(TAG_WM,
"Not removing " + win + " because app died while it's visible");
@@ -4408,12 +4407,11 @@ public class WindowManagerService extends IWindowManager.Stub
wtoken.waitingToShow = false;
wtoken.hiddenRequested = !visible;
if (!visible && wtoken.appDied) {
// This app is dead while it was visible, we kept its dead window on screen.
if (!visible) {
// If the app is dead while it was visible, we kept its dead window on screen.
// Now that the app is going invisible, we can remove it. It will be restarted
// if made visible again.
wtoken.appDied = false;
wtoken.removeAllWindows();
wtoken.removeAllDeadWindows();
} else if (visible) {
if (!mAppTransition.isTransitionSet() && mAppTransition.isReady()) {
// Add the app mOpeningApps if transition is unset but ready. This means

View File

@@ -1740,10 +1740,7 @@ final class WindowState implements WindowManagerPolicy.WindowState {
WindowState win = mService.windowForClientLocked(mSession, mClient, false);
Slog.i(TAG, "WIN DEATH: " + win);
if (win != null) {
if (win.mAppToken != null && !win.mAppToken.clientHidden) {
win.mAppToken.appDied = true;
}
mService.removeWindowLocked(win);
mService.removeWindowLocked(win, shouldKeepVisibleDeadAppWindow());
if (win.mAttrs.type == TYPE_DOCK_DIVIDER) {
// The owner of the docked divider died :( We reset the docked stack,
// just in case they have the divider at an unstable position. Better
@@ -1761,8 +1758,7 @@ final class WindowState implements WindowManagerPolicy.WindowState {
}
}
} catch (IllegalArgumentException ex) {
// This will happen if the window has already been
// removed.
// This will happen if the window has already been removed.
}
}
}
@@ -1773,7 +1769,7 @@ final class WindowState implements WindowManagerPolicy.WindowState {
* interacts with it.
*/
boolean shouldKeepVisibleDeadAppWindow() {
if (!isWinVisibleLw() || mAppToken == null || !mAppToken.appDied) {
if (!isWinVisibleLw() || mAppToken == null || mAppToken.clientHidden) {
// Not a visible app window or the app isn't dead.
return false;
}