diff options
| author | 2016-01-25 18:24:58 +0000 | |
|---|---|---|
| committer | 2016-01-25 18:24:58 +0000 | |
| commit | 2ced3d531c6c5d82db59db79bf8f890fb7acf200 (patch) | |
| tree | f8c07654aecf209f7e1e0a09922654583210ae05 | |
| parent | 844ccc5ad9fc9e5dc22c3bdd1d2418cce90a7720 (diff) | |
| parent | 3fd20fe8d8ff269b9253999dc8fc95a7a5269aef (diff) | |
Merge "Don't keep visible windows in pinned stack on screen when app dies"
3 files changed, 30 insertions, 1 deletions
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index 6307477aa766..420bf31a189d 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -608,6 +608,14 @@ public class ActivityManager { public static boolean resizeStackWithLaunchBounds(int stackId) { return stackId == PINNED_STACK_ID; } + + /** + * Returns true if any visible windows belonging to apps in this stack should be kept on + * screen when the app is killed due to something like the low memory killer. + */ + public static boolean keepVisibleDeadAppWindowOnScreen(int stackId) { + return stackId != PINNED_STACK_ID; + } } /** diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 1021411084c3..5adf6278dd9d 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -2193,7 +2193,7 @@ public class WindowManagerService extends IWindowManager.Stub // need to see about starting one. wasVisible = win.isWinVisibleLw(); - if (wasVisible && appToken != null && appToken.appDied) { + if (win.shouldKeepVisibleDeadAppWindow()) { if (DEBUG_ADD_REMOVE) Slog.v(TAG_WM, "Not removing " + win + " because app died while it's visible"); diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index dca7735f02fc..e8de90c93f0a 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -1615,6 +1615,27 @@ final class WindowState implements WindowManagerPolicy.WindowState { } } + /** + * Returns true if this window is visible and belongs to a dead app and shouldn't be removed, + * because we want to preserve its location on screen to be re-activated later when the user + * interacts with it. + */ + boolean shouldKeepVisibleDeadAppWindow() { + if (!isWinVisibleLw() || mAppToken == null || !mAppToken.appDied) { + // Not a visible app window or the app isn't dead. + return false; + } + + if (mAttrs.type == TYPE_APPLICATION_STARTING) { + // We don't keep starting windows since they were added by the window manager before + // the app even launched. + return false; + } + + final TaskStack stack = getStack(); + return stack != null && StackId.keepVisibleDeadAppWindowOnScreen(stack.mStackId); + } + /** @return true if this window desires key events. */ boolean canReceiveKeys() { return isVisibleOrAdding() |