diff options
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 + "}"; } |