Loading services/core/java/com/android/server/wm/AppWindowToken.java +15 −7 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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."); Loading services/core/java/com/android/server/wm/Task.java +3 −3 Original line number Diff line number Diff line Loading @@ -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; } } Loading @@ -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; Loading services/core/java/com/android/server/wm/WindowManagerService.java +8 −10 Original line number Diff line number Diff line Loading @@ -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)); Loading Loading @@ -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)); Loading Loading @@ -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"); Loading Loading @@ -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 Loading services/core/java/com/android/server/wm/WindowState.java +3 −7 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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. } } } Loading @@ -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; } Loading Loading
services/core/java/com/android/server/wm/AppWindowToken.java +15 −7 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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."); Loading
services/core/java/com/android/server/wm/Task.java +3 −3 Original line number Diff line number Diff line Loading @@ -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; } } Loading @@ -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; Loading
services/core/java/com/android/server/wm/WindowManagerService.java +8 −10 Original line number Diff line number Diff line Loading @@ -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)); Loading Loading @@ -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)); Loading Loading @@ -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"); Loading Loading @@ -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 Loading
services/core/java/com/android/server/wm/WindowState.java +3 −7 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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. } } } Loading @@ -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; } Loading