Merge "Move corner handles closer to task's rounded corners." into udc-qpr-dev

This commit is contained in:
Matt Sziklay
2023-06-12 17:58:01 +00:00
committed by Android (Google) Code Review
4 changed files with 60 additions and 7 deletions

View File

@@ -416,7 +416,7 @@
<!-- The radius of the caption menu shadow. --> <!-- The radius of the caption menu shadow. -->
<dimen name="desktop_mode_handle_menu_shadow_radius">2dp</dimen> <dimen name="desktop_mode_handle_menu_shadow_radius">2dp</dimen>
<dimen name="freeform_resize_handle">30dp</dimen> <dimen name="freeform_resize_handle">15dp</dimen>
<dimen name="freeform_resize_corner">44dp</dimen> <dimen name="freeform_resize_corner">44dp</dimen>
</resources> </resources>

View File

@@ -143,6 +143,7 @@ public class CaptionWindowDecoration extends WindowDecoration<WindowDecorLinearL
mHandler, mHandler,
mChoreographer, mChoreographer,
mDisplay.getDisplayId(), mDisplay.getDisplayId(),
0 /* taskCornerRadius */,
mDecorationContainerSurface, mDecorationContainerSurface,
mDragPositioningCallback); mDragPositioningCallback);
} }

View File

@@ -235,6 +235,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin
mHandler, mHandler,
mChoreographer, mChoreographer,
mDisplay.getDisplayId(), mDisplay.getDisplayId(),
mRelayoutParams.mCornerRadius,
mDecorationContainerSurface, mDecorationContainerSurface,
mDragPositioningCallback); mDragPositioningCallback);
} }

View File

@@ -56,7 +56,7 @@ import com.android.internal.view.BaseIWindow;
*/ */
class DragResizeInputListener implements AutoCloseable { class DragResizeInputListener implements AutoCloseable {
private static final String TAG = "DragResizeInputListener"; private static final String TAG = "DragResizeInputListener";
private static final float TOP_CORNER_PADDING = 1.5f;
private final IWindowSession mWindowSession = WindowManagerGlobal.getWindowSession(); private final IWindowSession mWindowSession = WindowManagerGlobal.getWindowSession();
private final Handler mHandler; private final Handler mHandler;
private final Choreographer mChoreographer; private final Choreographer mChoreographer;
@@ -74,6 +74,7 @@ class DragResizeInputListener implements AutoCloseable {
private int mTaskHeight; private int mTaskHeight;
private int mResizeHandleThickness; private int mResizeHandleThickness;
private int mCornerSize; private int mCornerSize;
private int mTaskCornerRadius;
private Rect mLeftTopCornerBounds; private Rect mLeftTopCornerBounds;
private Rect mRightTopCornerBounds; private Rect mRightTopCornerBounds;
@@ -88,12 +89,14 @@ class DragResizeInputListener implements AutoCloseable {
Handler handler, Handler handler,
Choreographer choreographer, Choreographer choreographer,
int displayId, int displayId,
int taskCornerRadius,
SurfaceControl decorationSurface, SurfaceControl decorationSurface,
DragPositioningCallback callback) { DragPositioningCallback callback) {
mInputManager = context.getSystemService(InputManager.class); mInputManager = context.getSystemService(InputManager.class);
mHandler = handler; mHandler = handler;
mChoreographer = choreographer; mChoreographer = choreographer;
mDisplayId = displayId; mDisplayId = displayId;
mTaskCornerRadius = taskCornerRadius;
mDecorationSurface = decorationSurface; mDecorationSurface = decorationSurface;
// Use a fake window as the backing surface is a container layer and we don't want to create // Use a fake window as the backing surface is a container layer and we don't want to create
// a buffer layer for it so we can't use ViewRootImpl. // a buffer layer for it so we can't use ViewRootImpl.
@@ -384,20 +387,68 @@ class DragResizeInputListener implements AutoCloseable {
@DragPositioningCallback.CtrlType @DragPositioningCallback.CtrlType
private int calculateResizeHandlesCtrlType(float x, float y) { private int calculateResizeHandlesCtrlType(float x, float y) {
int ctrlType = 0; int ctrlType = 0;
if (x < 0) { // mTaskCornerRadius is only used in comparing with corner regions. Comparisons with
// sides will use the bounds specified in setGeometry and not go into task bounds.
if (x < mTaskCornerRadius) {
ctrlType |= CTRL_TYPE_LEFT; ctrlType |= CTRL_TYPE_LEFT;
} }
if (x > mTaskWidth) { if (x > mTaskWidth - mTaskCornerRadius) {
ctrlType |= CTRL_TYPE_RIGHT; ctrlType |= CTRL_TYPE_RIGHT;
} }
if (y < 0) { if (y < mTaskCornerRadius) {
ctrlType |= CTRL_TYPE_TOP; ctrlType |= CTRL_TYPE_TOP;
} }
if (y > mTaskHeight) { if (y > mTaskHeight - mTaskCornerRadius) {
ctrlType |= CTRL_TYPE_BOTTOM; ctrlType |= CTRL_TYPE_BOTTOM;
} }
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; 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 @DragPositioningCallback.CtrlType
private int calculateCornersCtrlType(float x, float y) { private int calculateCornersCtrlType(float x, float y) {