summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Wale Ogunwale <ogunwale@google.com> 2016-01-25 18:24:58 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2016-01-25 18:24:58 +0000
commit2ced3d531c6c5d82db59db79bf8f890fb7acf200 (patch)
treef8c07654aecf209f7e1e0a09922654583210ae05
parent844ccc5ad9fc9e5dc22c3bdd1d2418cce90a7720 (diff)
parent3fd20fe8d8ff269b9253999dc8fc95a7a5269aef (diff)
Merge "Don't keep visible windows in pinned stack on screen when app dies"
-rw-r--r--core/java/android/app/ActivityManager.java8
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java2
-rw-r--r--services/core/java/com/android/server/wm/WindowState.java21
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()