Merge "Allow changing mouse cursor for the edges of resizable window."

This commit is contained in:
Jun Mukai
2015-10-16 17:13:25 +00:00
committed by Android (Google) Code Review
2 changed files with 49 additions and 0 deletions

View File

@@ -4192,6 +4192,8 @@ public final class ViewRootImpl implements ViewParent,
mPointerIconShape = pointerShape;
event.getDevice().setPointerShape(pointerShape);
}
} else if (event.getActionMasked() == MotionEvent.ACTION_HOVER_MOVE) {
mPointerIconShape = PointerIcon.STYLE_NOT_SPECIFIED;
}
}

View File

@@ -16,13 +16,22 @@
package com.android.server.wm;
import android.graphics.Rect;
import android.graphics.Region;
import android.view.DisplayInfo;
import android.view.InputDevice;
import android.view.MotionEvent;
import android.view.WindowManagerPolicy.PointerEventListener;
import com.android.server.wm.WindowManagerService.H;
import static android.view.PointerIcon.STYLE_NOT_SPECIFIED;
import static android.view.PointerIcon.STYLE_DEFAULT;
import static android.view.PointerIcon.STYLE_HORIZONTAL_DOUBLE_ARROW;
import static android.view.PointerIcon.STYLE_VERTICAL_DOUBLE_ARROW;
import static android.view.PointerIcon.STYLE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW;
import static android.view.PointerIcon.STYLE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW;
public class TaskTapPointerEventListener implements PointerEventListener {
private static final int TAP_TIMEOUT_MSEC = 300;
private static final float TAP_MOTION_SLOP_INCHES = 0.125f;
@@ -34,6 +43,8 @@ public class TaskTapPointerEventListener implements PointerEventListener {
final private Region mTouchExcludeRegion = new Region();
private final WindowManagerService mService;
private final DisplayContent mDisplayContent;
private final Rect mTmpRect = new Rect();
private int mPointerIconShape = STYLE_NOT_SPECIFIED;
public TaskTapPointerEventListener(WindowManagerService service,
DisplayContent displayContent) {
@@ -76,6 +87,42 @@ public class TaskTapPointerEventListener implements PointerEventListener {
break;
}
case MotionEvent.ACTION_HOVER_MOVE: {
final int x = (int) motionEvent.getX();
final int y = (int) motionEvent.getY();
final WindowState window = mDisplayContent.findWindowForControlPoint(x, y);
if (window == null) {
break;
}
window.getVisibleBounds(mTmpRect, false);
if (!mTmpRect.isEmpty() && !mTmpRect.contains(x, y)) {
int iconShape = STYLE_DEFAULT;
if (x < mTmpRect.left) {
iconShape =
(y < mTmpRect.top) ? STYLE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW :
(y > mTmpRect.bottom) ? STYLE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW :
STYLE_HORIZONTAL_DOUBLE_ARROW;
} else if (x > mTmpRect.right) {
iconShape =
(y < mTmpRect.top) ? STYLE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW :
(y > mTmpRect.bottom) ? STYLE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW :
STYLE_HORIZONTAL_DOUBLE_ARROW;
} else if (y < mTmpRect.top || y > mTmpRect.bottom) {
iconShape = STYLE_VERTICAL_DOUBLE_ARROW;
}
if (mPointerIconShape != iconShape) {
mPointerIconShape = iconShape;
motionEvent.getDevice().setPointerShape(iconShape);
}
} else {
mPointerIconShape = STYLE_NOT_SPECIFIED;
}
} break;
case MotionEvent.ACTION_HOVER_EXIT:
motionEvent.getDevice().setPointerShape(STYLE_DEFAULT);
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP: {
int index = (action & MotionEvent.ACTION_POINTER_INDEX_MASK)