From f091eea7f5f782486a1410c18a309ce186c4c3fe Mon Sep 17 00:00:00 2001 From: mattsziklay Date: Tue, 6 Jun 2023 10:45:17 -0700 Subject: [PATCH] Move corner handles closer to task's rounded corners. Moves handles closer to task bounds and adds a distance check to ensure mouse inputs don't register as corner inputs beyond a certain distance. Video: http://recall/-/eKxklN4CHu7YvO9E4ZpRD8/fr7SEzvdJQY0NiKj8RTa17 Bug: 280827642 Test: Manual Change-Id: Ibdf35767ad8b6196e85fab13372dc7bb3424f738 --- libs/WindowManager/Shell/res/values/dimen.xml | 2 +- .../windowdecor/CaptionWindowDecoration.java | 1 + .../DesktopModeWindowDecoration.java | 1 + .../windowdecor/DragResizeInputListener.java | 63 +++++++++++++++++-- 4 files changed, 60 insertions(+), 7 deletions(-) diff --git a/libs/WindowManager/Shell/res/values/dimen.xml b/libs/WindowManager/Shell/res/values/dimen.xml index 214125928892b..2e3f60441b3a4 100644 --- a/libs/WindowManager/Shell/res/values/dimen.xml +++ b/libs/WindowManager/Shell/res/values/dimen.xml @@ -416,7 +416,7 @@ 2dp - 30dp + 15dp 44dp 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 cea0fcb2a9c3d..b217bd39a4466 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 @@ -143,6 +143,7 @@ public class CaptionWindowDecoration extends WindowDecoration mTaskWidth) { + if (x > mTaskWidth - mTaskCornerRadius) { ctrlType |= CTRL_TYPE_RIGHT; } - if (y < 0) { + if (y < mTaskCornerRadius) { ctrlType |= CTRL_TYPE_TOP; } - if (y > mTaskHeight) { + if (y > mTaskHeight - mTaskCornerRadius) { ctrlType |= CTRL_TYPE_BOTTOM; } - return ctrlType; + return checkDistanceFromCenter(ctrlType, x, y); + } + + // If corner input is not within appropriate distance of corner radius, do not use it. + // If input is not on a corner or is within valid distance, return ctrlType. + @DragPositioningCallback.CtrlType + private int checkDistanceFromCenter(@DragPositioningCallback.CtrlType int ctrlType, + float x, float y) { + int centerX; + int centerY; + + // Determine center of rounded corner circle; this is simply the corner if radius is 0. + switch (ctrlType) { + case CTRL_TYPE_LEFT | CTRL_TYPE_TOP: { + centerX = mTaskCornerRadius; + centerY = mTaskCornerRadius; + break; + } + case CTRL_TYPE_LEFT | CTRL_TYPE_BOTTOM: { + centerX = mTaskCornerRadius; + centerY = mTaskHeight - mTaskCornerRadius; + break; + } + case CTRL_TYPE_RIGHT | CTRL_TYPE_TOP: { + centerX = mTaskWidth - mTaskCornerRadius; + centerY = mTaskCornerRadius; + break; + } + case CTRL_TYPE_RIGHT | CTRL_TYPE_BOTTOM: { + centerX = mTaskWidth - mTaskCornerRadius; + centerY = mTaskHeight - mTaskCornerRadius; + break; + } + default: { + return ctrlType; + } + } + double distanceFromCenter = Math.hypot(x - centerX, y - centerY); + + // TODO(b/286461778): Remove this when input in top corner gap no longer goes to header + float cornerPadding = (ctrlType & CTRL_TYPE_TOP) != 0 ? TOP_CORNER_PADDING : 1; + + if (distanceFromCenter < mTaskCornerRadius + mResizeHandleThickness * cornerPadding + && distanceFromCenter >= mTaskCornerRadius) { + return ctrlType; + } + return 0; } @DragPositioningCallback.CtrlType