diff options
4 files changed, 19 insertions, 5 deletions
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index f914369..5d6df26 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -238,6 +238,7 @@ class DisplayContent { final TaskStack stack = win.getStack(); if (win.isVisibleLw() && stack != null && stack != focusedStack) { mTmpRect.set(win.mVisibleFrame); + // If no intersection, we need mTmpRect to be unmodified. mTmpRect.intersect(win.mVisibleInsets); mTouchExcludeRegion.op(mTmpRect, Region.Op.DIFFERENCE); } diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java index 7cdf8b2..4545032 100644 --- a/services/core/java/com/android/server/wm/TaskStack.java +++ b/services/core/java/com/android/server/wm/TaskStack.java @@ -144,7 +144,11 @@ public class TaskStack { bounds = mTmpRect; mFullscreen = true; } else { - bounds.intersect(mTmpRect); // ensure bounds are entirely within the display rect + // ensure bounds are entirely within the display rect + if (!bounds.intersect(mTmpRect)) { + // Can't set bounds outside the containing display.. Sorry! + return false; + } mFullscreen = mTmpRect.equals(bounds); } } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 5d8979f..6bc089d 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -6221,7 +6221,10 @@ public class WindowManagerService extends IWindowManager.Stub int bottom = wf.bottom - cr.bottom; frame.union(left, top, right, bottom); ws.getStackBounds(stackBounds); - frame.intersect(stackBounds); + if (!frame.intersect(stackBounds)) { + // Set frame empty if there's no intersection. + frame.setEmpty(); + } } if (ws.mAppToken != null && ws.mAppToken.token == appToken && @@ -6268,12 +6271,16 @@ public class WindowManagerService extends IWindowManager.Stub if (!includeFullDisplay) { // Constrain frame to the screen size. - frame.intersect(0, 0, dw, dh); + if (!frame.intersect(0, 0, dw, dh)) { + frame.setEmpty(); + } } else { // Caller just wants entire display. frame.set(0, 0, dw, dh); } - + if (frame.isEmpty()) { + return null; + } if (width < 0) { width = frame.width(); diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 193d812..62a8420 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -534,7 +534,9 @@ final class WindowState implements WindowManagerPolicy.WindowState { } // Make sure the containing frame is within the content frame so we don't layout // resized window under screen decorations. - mContainingFrame.intersect(cf); + if (!mContainingFrame.intersect(cf)) { + mContainingFrame.set(cf); + } mDisplayFrame.set(mContainingFrame); } else { mContainingFrame.set(pf); |