Merge "Move corner handles closer to task's rounded corners." into udc-qpr-dev am: c516724ebf
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/23604820 Change-Id: I0069d12b6a853daefa6fa30c9328bc7a7f080ae1 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -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>
|
||||||
|
|||||||
@@ -143,6 +143,7 @@ public class CaptionWindowDecoration extends WindowDecoration<WindowDecorLinearL
|
|||||||
mHandler,
|
mHandler,
|
||||||
mChoreographer,
|
mChoreographer,
|
||||||
mDisplay.getDisplayId(),
|
mDisplay.getDisplayId(),
|
||||||
|
0 /* taskCornerRadius */,
|
||||||
mDecorationContainerSurface,
|
mDecorationContainerSurface,
|
||||||
mDragPositioningCallback);
|
mDragPositioningCallback);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -235,6 +235,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin
|
|||||||
mHandler,
|
mHandler,
|
||||||
mChoreographer,
|
mChoreographer,
|
||||||
mDisplay.getDisplayId(),
|
mDisplay.getDisplayId(),
|
||||||
|
mRelayoutParams.mCornerRadius,
|
||||||
mDecorationContainerSurface,
|
mDecorationContainerSurface,
|
||||||
mDragPositioningCallback);
|
mDragPositioningCallback);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user