summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/view/ViewRootImpl.java2
-rw-r--r--services/core/java/com/android/server/wm/TaskTapPointerEventListener.java47
2 files changed, 49 insertions, 0 deletions
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 13b6a42e8d02..6a1d9d54cf43 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -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;
}
}
diff --git a/services/core/java/com/android/server/wm/TaskTapPointerEventListener.java b/services/core/java/com/android/server/wm/TaskTapPointerEventListener.java
index ce1b785c6d06..a33fb13f0325 100644
--- a/services/core/java/com/android/server/wm/TaskTapPointerEventListener.java
+++ b/services/core/java/com/android/server/wm/TaskTapPointerEventListener.java
@@ -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)