Fix calls to Rect.intersect(Rect) in package com.android.server.wm

This CL checks for the return value for Rect.intersect(Rect) for whether
there is actually an intersection before taking the calling rect as the
intersection. In addtion, this CL handles the cases where there is no
intersection (Rect.intersect(Rect) returns false).

bug: 7368679
Change-Id: I7d5ef7059ac432170470a108c0d6dece230ec0b3
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 @@
             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 @@
                 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 @@
                         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 @@
 
                 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 @@
             }
             // 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);