Merge "Use Task Position to check if task is below disallowed area" into main
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragPositioningCallbackUtility.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragPositioningCallbackUtility.java
index e32bd42..cb0a6c7 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragPositioningCallbackUtility.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragPositioningCallbackUtility.java
@@ -143,6 +143,24 @@
     }
 
     /**
+     * Calculates the new position of the top edge of the task and returns true if it is below the
+     * disallowed area.
+     *
+     * @param disallowedAreaForEndBoundsHeight the height of the area that where the task positioner
+     *                                         should not finalize the bounds using WCT#setBounds
+     * @param taskBoundsAtDragStart the bounds of the task on the first drag input event
+     * @param repositionStartPoint initial input coordinate
+     * @param y the y position of the motion event
+     * @return true if the top of the task is below the disallowed area
+     */
+    static boolean isBelowDisallowedArea(int disallowedAreaForEndBoundsHeight,
+            Rect taskBoundsAtDragStart, PointF repositionStartPoint, float y) {
+        final float deltaY = y - repositionStartPoint.y;
+        final float topPosition = taskBoundsAtDragStart.top + deltaY;
+        return topPosition > disallowedAreaForEndBoundsHeight;
+    }
+
+    /**
      * Updates repositionTaskBounds to the final bounds of the task after the drag is finished. If
      * the bounds are outside of the stable bounds, they are shifted to place task at the top of the
      * stable bounds.
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/FluidResizeTaskPositioner.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/FluidResizeTaskPositioner.java
index e0ee252..389db62 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/FluidResizeTaskPositioner.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/FluidResizeTaskPositioner.java
@@ -125,7 +125,9 @@
             }
             mTaskOrganizer.applyTransaction(wct);
         } else if (mCtrlType == CTRL_TYPE_UNDEFINED
-                && y > mDisallowedAreaForEndBoundsHeight) {
+                && DragPositioningCallbackUtility.isBelowDisallowedArea(
+                mDisallowedAreaForEndBoundsHeight, mTaskBoundsAtDragStart, mRepositionStartPoint,
+                y)) {
             final WindowContainerTransaction wct = new WindowContainerTransaction();
             DragPositioningCallbackUtility.onDragEnd(mRepositionTaskBounds,
                     mTaskBoundsAtDragStart, mStableBounds, mRepositionStartPoint, x, y);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/VeiledResizeTaskPositioner.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/VeiledResizeTaskPositioner.java
index c9c58de..303954a 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/VeiledResizeTaskPositioner.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/VeiledResizeTaskPositioner.java
@@ -142,7 +142,9 @@
                 // won't be called.
                 mDesktopWindowDecoration.hideResizeVeil();
             }
-        } else if (y > mDisallowedAreaForEndBoundsHeight) {
+        } else if (DragPositioningCallbackUtility.isBelowDisallowedArea(
+                mDisallowedAreaForEndBoundsHeight, mTaskBoundsAtDragStart, mRepositionStartPoint,
+                y)) {
             DragPositioningCallbackUtility.onDragEnd(mRepositionTaskBounds,
                     mTaskBoundsAtDragStart, mStableBounds, mRepositionStartPoint, x, y);
             DragPositioningCallbackUtility.applyTaskBoundsChange(new WindowContainerTransaction(),