summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/wm/DimLayer.java2
-rw-r--r--services/core/java/com/android/server/wm/DimLayerController.java17
-rw-r--r--services/core/java/com/android/server/wm/DockedStackDividerController.java5
-rw-r--r--services/core/java/com/android/server/wm/Task.java7
-rw-r--r--services/core/java/com/android/server/wm/TaskPositioner.java5
-rw-r--r--services/core/java/com/android/server/wm/TaskStack.java5
6 files changed, 38 insertions, 3 deletions
diff --git a/services/core/java/com/android/server/wm/DimLayer.java b/services/core/java/com/android/server/wm/DimLayer.java
index b99dda15b22e..015c08466708 100644
--- a/services/core/java/com/android/server/wm/DimLayer.java
+++ b/services/core/java/com/android/server/wm/DimLayer.java
@@ -77,6 +77,8 @@ public class DimLayer {
boolean dimFullscreen();
/** Returns the display info. of the dim layer user. */
DisplayInfo getDisplayInfo();
+ /** Returns true if the dim layer user is currently attached to a display */
+ boolean isAttachedToDisplay();
/** Gets the bounds of the dim layer user. */
void getDimBounds(Rect outBounds);
String toShortString();
diff --git a/services/core/java/com/android/server/wm/DimLayerController.java b/services/core/java/com/android/server/wm/DimLayerController.java
index 04ae72f97e93..2ec2dba88888 100644
--- a/services/core/java/com/android/server/wm/DimLayerController.java
+++ b/services/core/java/com/android/server/wm/DimLayerController.java
@@ -191,8 +191,21 @@ class DimLayerController {
boolean result = false;
for (int i = mState.size() - 1; i >= 0; i--) {
- DimLayer.DimLayerUser user = mState.keyAt(i);
- DimLayerState state = mState.valueAt(i);
+ final DimLayer.DimLayerUser user = mState.keyAt(i);
+ final DimLayerState state = mState.valueAt(i);
+
+ if (!user.isAttachedToDisplay()) {
+ // Leaked dim user that is no longer attached to the display. Go ahead and clean it
+ // clean-up and log what happened.
+ // TODO: This is a work around for b/34395537 as the dim user should have cleaned-up
+ // it self when it was detached from the display. Need to investigate how the dim
+ // user is leaking...
+ Slog.wtfStack(TAG_WM, "Leaked dim user=" + user.toShortString()
+ + " state=" + state);
+ removeDimLayerUser(user);
+ continue;
+ }
+
// We have to check that we are actually the shared fullscreen layer
// for this path. If we began as non fullscreen and became fullscreen
// (e.g. Docked stack closing), then we may not be the shared layer
diff --git a/services/core/java/com/android/server/wm/DockedStackDividerController.java b/services/core/java/com/android/server/wm/DockedStackDividerController.java
index e6bc7f44ab0c..ed1e2d998d63 100644
--- a/services/core/java/com/android/server/wm/DockedStackDividerController.java
+++ b/services/core/java/com/android/server/wm/DockedStackDividerController.java
@@ -835,6 +835,11 @@ public class DockedStackDividerController implements DimLayerUser {
}
@Override
+ public boolean isAttachedToDisplay() {
+ return mDisplayContent != null;
+ }
+
+ @Override
public void getDimBounds(Rect outBounds) {
// This dim layer user doesn't need this.
}
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index 824d4606dfe9..680d0f2881a6 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -628,7 +628,12 @@ class Task extends WindowContainer<AppWindowToken> implements DimLayer.DimLayerU
@Override
public DisplayInfo getDisplayInfo() {
- return mStack.getDisplayContent().getDisplayInfo();
+ return getDisplayContent().getDisplayInfo();
+ }
+
+ @Override
+ public boolean isAttachedToDisplay() {
+ return getDisplayContent() != null;
}
void forceWindowsScaleable(boolean force) {
diff --git a/services/core/java/com/android/server/wm/TaskPositioner.java b/services/core/java/com/android/server/wm/TaskPositioner.java
index 267566bfd6f7..7bc577eae468 100644
--- a/services/core/java/com/android/server/wm/TaskPositioner.java
+++ b/services/core/java/com/android/server/wm/TaskPositioner.java
@@ -693,6 +693,11 @@ class TaskPositioner implements DimLayer.DimLayerUser {
}
@Override
+ public boolean isAttachedToDisplay() {
+ return mTask != null && mTask.getDisplayContent() != null;
+ }
+
+ @Override
public void getDimBounds(Rect out) {
// This dim layer user doesn't need this.
}
diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java
index eeea532858f1..bebc74544372 100644
--- a/services/core/java/com/android/server/wm/TaskStack.java
+++ b/services/core/java/com/android/server/wm/TaskStack.java
@@ -1209,6 +1209,11 @@ public class TaskStack extends WindowContainer<Task> implements DimLayer.DimLaye
}
@Override
+ public boolean isAttachedToDisplay() {
+ return mDisplayContent != null;
+ }
+
+ @Override
public String toString() {
return "{stackId=" + mStackId + " tasks=" + mChildren + "}";
}