diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecoration.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecoration.java index 733f6b7d5dbf7..9a9dca05eb335 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecoration.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecoration.java @@ -28,6 +28,7 @@ import android.os.Handler; import android.view.Choreographer; import android.view.SurfaceControl; import android.view.View; +import android.view.ViewConfiguration; import android.window.WindowContainerTransaction; import com.android.wm.shell.R; @@ -55,6 +56,7 @@ public class CaptionWindowDecoration extends WindowDecoration mTouchSlop) { + mDragging = true; + } + } else { + // For all other types allow immediate dragging. + mDragging = true; + } + if (mDragging) { + mCallback.onDragResizeMove(rawX, rawY); + result = true; + } break; } case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: { - int dragPointerIndex = e.findPointerIndex(mDragPointerId); - mCallback.onDragResizeEnd( - e.getRawX(dragPointerIndex), e.getRawY(dragPointerIndex)); + if (mDragging) { + int dragPointerIndex = e.findPointerIndex(mDragPointerId); + mCallback.onDragResizeEnd( + e.getRawX(dragPointerIndex), e.getRawY(dragPointerIndex)); + } + mDragging = false; + mShouldHandleEvents = false; + mActionDownPoint.set(0, 0); mDragPointerId = -1; + result = true; break; } case MotionEvent.ACTION_HOVER_ENTER: case MotionEvent.ACTION_HOVER_MOVE: { updateCursorType(e.getXCursorPosition(), e.getYCursorPosition()); + result = true; break; } case MotionEvent.ACTION_HOVER_EXIT: mInputManager.setPointerIconType(PointerIcon.TYPE_DEFAULT); + result = true; break; } - return true; + return result; + } + + private boolean isInCornerBounds(float xf, float yf) { + return calculateCornersCtrlType(xf, yf) != 0; + } + + private boolean isInResizeHandleBounds(float x, float y) { + return calculateResizeHandlesCtrlType(x, y) != 0; } @TaskPositioner.CtrlType - private int calculateCtrlType(float x, float y) { + private int calculateCtrlType(boolean isTouch, float x, float y) { + if (isTouch) { + return calculateCornersCtrlType(x, y); + } + return calculateResizeHandlesCtrlType(x, y); + } + + @TaskPositioner.CtrlType + private int calculateResizeHandlesCtrlType(float x, float y) { int ctrlType = 0; if (x < mResizeHandleThickness) { ctrlType |= TaskPositioner.CTRL_TYPE_LEFT; @@ -267,8 +383,27 @@ class DragResizeInputListener implements AutoCloseable { return ctrlType; } + @TaskPositioner.CtrlType + private int calculateCornersCtrlType(float x, float y) { + int xi = (int) x; + int yi = (int) y; + if (mLeftTopCornerBounds.contains(xi, yi)) { + return TaskPositioner.CTRL_TYPE_LEFT | TaskPositioner.CTRL_TYPE_TOP; + } + if (mLeftBottomCornerBounds.contains(xi, yi)) { + return TaskPositioner.CTRL_TYPE_LEFT | TaskPositioner.CTRL_TYPE_BOTTOM; + } + if (mRightTopCornerBounds.contains(xi, yi)) { + return TaskPositioner.CTRL_TYPE_RIGHT | TaskPositioner.CTRL_TYPE_TOP; + } + if (mRightBottomCornerBounds.contains(xi, yi)) { + return TaskPositioner.CTRL_TYPE_RIGHT | TaskPositioner.CTRL_TYPE_BOTTOM; + } + return 0; + } + private void updateCursorType(float x, float y) { - @TaskPositioner.CtrlType int ctrlType = calculateCtrlType(x, y); + @TaskPositioner.CtrlType int ctrlType = calculateResizeHandlesCtrlType(x, y); int cursorType = PointerIcon.TYPE_DEFAULT; switch (ctrlType) { @@ -292,4 +427,4 @@ class DragResizeInputListener implements AutoCloseable { mInputManager.setPointerIconType(cursorType); } } -} +} \ No newline at end of file diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/TaskPositioner.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/TaskPositioner.java index 280569b05d870..27c10114ac0ec 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/TaskPositioner.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/TaskPositioner.java @@ -25,9 +25,10 @@ import com.android.wm.shell.ShellTaskOrganizer; class TaskPositioner implements DragResizeCallback { - @IntDef({CTRL_TYPE_LEFT, CTRL_TYPE_RIGHT, CTRL_TYPE_TOP, CTRL_TYPE_BOTTOM}) + @IntDef({CTRL_TYPE_UNDEFINED, CTRL_TYPE_LEFT, CTRL_TYPE_RIGHT, CTRL_TYPE_TOP, CTRL_TYPE_BOTTOM}) @interface CtrlType {} + static final int CTRL_TYPE_UNDEFINED = 0; static final int CTRL_TYPE_LEFT = 1; static final int CTRL_TYPE_RIGHT = 2; static final int CTRL_TYPE_TOP = 4;