Gesture exclusion rects for Window

Property methods to get/set gesture exclusion rects for a window.
This is useful for games or other frameworks that use Window#takeSurface
and do not have a view hierarchy, leaving the associated View methods
unavailable.

Bug: 130572780
Test: cts via "atest SystemGestureExclusionRectsTest"
Change-Id: I2704aef1d1950158fcabf7c91413bedee08b8971
diff --git a/core/java/android/view/GestureExclusionTracker.java b/core/java/android/view/GestureExclusionTracker.java
index 8eccc04..6fcdd71 100644
--- a/core/java/android/view/GestureExclusionTracker.java
+++ b/core/java/android/view/GestureExclusionTracker.java
@@ -20,6 +20,8 @@
 import android.annotation.Nullable;
 import android.graphics.Rect;
 
+import com.android.internal.util.Preconditions;
+
 import java.lang.ref.WeakReference;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -31,6 +33,8 @@
  */
 class GestureExclusionTracker {
     private boolean mGestureExclusionViewsChanged = false;
+    private boolean mRootGestureExclusionRectsChanged = false;
+    private List<Rect> mRootGestureExclusionRects = Collections.emptyList();
     private List<GestureExclusionViewInfo> mGestureExclusionViewInfos = new ArrayList<>();
     private List<Rect> mGestureExclusionRects = Collections.emptyList();
 
@@ -59,9 +63,9 @@
 
     @Nullable
     public List<Rect> computeChangedRects() {
-        boolean changed = false;
+        boolean changed = mRootGestureExclusionRectsChanged;
         final Iterator<GestureExclusionViewInfo> i = mGestureExclusionViewInfos.iterator();
-        final List<Rect> rects = new ArrayList<>();
+        final List<Rect> rects = new ArrayList<>(mRootGestureExclusionRects);
         while (i.hasNext()) {
             final GestureExclusionViewInfo info = i.next();
             switch (info.update()) {
@@ -79,6 +83,7 @@
         }
         if (changed || mGestureExclusionViewsChanged) {
             mGestureExclusionViewsChanged = false;
+            mRootGestureExclusionRectsChanged = false;
             if (!mGestureExclusionRects.equals(rects)) {
                 mGestureExclusionRects = rects;
                 return rects;
@@ -87,6 +92,17 @@
         return null;
     }
 
+    public void setRootSystemGestureExclusionRects(@NonNull List<Rect> rects) {
+        Preconditions.checkNotNull(rects, "rects must not be null");
+        mRootGestureExclusionRects = rects;
+        mRootGestureExclusionRectsChanged = true;
+    }
+
+    @NonNull
+    public List<Rect> getRootSystemGestureExclusionRects() {
+        return mRootGestureExclusionRects;
+    }
+
     private static class GestureExclusionViewInfo {
         public static final int CHANGED = 0;
         public static final int UNCHANGED = 1;