diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index 6152dada43b26..a68d7af08118b 100644 --- a/services/core/java/com/android/server/wm/DisplayPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayPolicy.java @@ -344,7 +344,6 @@ public class DisplayPolicy { private boolean mShouldAttachNavBarToAppDuringTransition; // -------- PolicyHandler -------- - private static final int MSG_REQUEST_TRANSIENT_BARS = 2; private static final int MSG_ENABLE_POINTER_LOCATION = 4; private static final int MSG_DISABLE_POINTER_LOCATION = 5; @@ -364,11 +363,6 @@ public class DisplayPolicy { @Override public void handleMessage(Message msg) { switch (msg.what) { - case MSG_REQUEST_TRANSIENT_BARS: - synchronized (mLock) { - ((Runnable) msg.obj).run(); - } - break; case MSG_ENABLE_POINTER_LOCATION: enablePointerLocation(); break; @@ -413,7 +407,11 @@ public class DisplayPolicy { mSystemGestures = new SystemGesturesPointerEventListener(mUiContext, mHandler, new SystemGesturesPointerEventListener.Callbacks() { + private static final long MOUSE_GESTURE_DELAY_MS = 500; + + private Runnable mOnSwipeFromLeft = this::onSwipeFromLeft; private Runnable mOnSwipeFromTop = this::onSwipeFromTop; + private Runnable mOnSwipeFromRight = this::onSwipeFromRight; private Runnable mOnSwipeFromBottom = this::onSwipeFromBottom; private Insets getControllableInsets(WindowState win) { @@ -513,25 +511,48 @@ public class DisplayPolicy { } } + @Override + public void onMouseHoverAtLeft() { + mHandler.removeCallbacks(mOnSwipeFromLeft); + mHandler.postDelayed(mOnSwipeFromLeft, MOUSE_GESTURE_DELAY_MS); + } + @Override public void onMouseHoverAtTop() { - mHandler.removeMessages(MSG_REQUEST_TRANSIENT_BARS); - Message msg = mHandler.obtainMessage(MSG_REQUEST_TRANSIENT_BARS); - msg.obj = mOnSwipeFromTop; - mHandler.sendMessageDelayed(msg, 500 /* delayMillis */); + mHandler.removeCallbacks(mOnSwipeFromTop); + mHandler.postDelayed(mOnSwipeFromTop, MOUSE_GESTURE_DELAY_MS); + } + + @Override + public void onMouseHoverAtRight() { + mHandler.removeCallbacks(mOnSwipeFromRight); + mHandler.postDelayed(mOnSwipeFromRight, MOUSE_GESTURE_DELAY_MS); } @Override public void onMouseHoverAtBottom() { - mHandler.removeMessages(MSG_REQUEST_TRANSIENT_BARS); - Message msg = mHandler.obtainMessage(MSG_REQUEST_TRANSIENT_BARS); - msg.obj = mOnSwipeFromBottom; - mHandler.sendMessageDelayed(msg, 500 /* delayMillis */); + mHandler.removeCallbacks(mOnSwipeFromBottom); + mHandler.postDelayed(mOnSwipeFromBottom, MOUSE_GESTURE_DELAY_MS); } @Override - public void onMouseLeaveFromEdge() { - mHandler.removeMessages(MSG_REQUEST_TRANSIENT_BARS); + public void onMouseLeaveFromLeft() { + mHandler.removeCallbacks(mOnSwipeFromLeft); + } + + @Override + public void onMouseLeaveFromTop() { + mHandler.removeCallbacks(mOnSwipeFromTop); + } + + @Override + public void onMouseLeaveFromRight() { + mHandler.removeCallbacks(mOnSwipeFromRight); + } + + @Override + public void onMouseLeaveFromBottom() { + mHandler.removeCallbacks(mOnSwipeFromBottom); } }); displayContent.registerPointerEventListener(mSystemGestures); diff --git a/services/core/java/com/android/server/wm/SystemGesturesPointerEventListener.java b/services/core/java/com/android/server/wm/SystemGesturesPointerEventListener.java index 658f4efbdb2fb..878b33fa55ef7 100644 --- a/services/core/java/com/android/server/wm/SystemGesturesPointerEventListener.java +++ b/services/core/java/com/android/server/wm/SystemGesturesPointerEventListener.java @@ -78,7 +78,10 @@ class SystemGesturesPointerEventListener implements PointerEventListener { private int mDownPointers; private boolean mSwipeFireable; private boolean mDebugFireable; - private boolean mMouseHoveringAtEdge; + private boolean mMouseHoveringAtLeft; + private boolean mMouseHoveringAtTop; + private boolean mMouseHoveringAtRight; + private boolean mMouseHoveringAtBottom; private long mLastFlingTime; SystemGesturesPointerEventListener(Context context, Handler handler, Callbacks callbacks) { @@ -174,9 +177,21 @@ class SystemGesturesPointerEventListener implements PointerEventListener { mDebugFireable = true; mDownPointers = 0; captureDown(event, 0); - if (mMouseHoveringAtEdge) { - mMouseHoveringAtEdge = false; - mCallbacks.onMouseLeaveFromEdge(); + if (mMouseHoveringAtLeft) { + mMouseHoveringAtLeft = false; + mCallbacks.onMouseLeaveFromLeft(); + } + if (mMouseHoveringAtTop) { + mMouseHoveringAtTop = false; + mCallbacks.onMouseLeaveFromTop(); + } + if (mMouseHoveringAtRight) { + mMouseHoveringAtRight = false; + mCallbacks.onMouseLeaveFromRight(); + } + if (mMouseHoveringAtBottom) { + mMouseHoveringAtBottom = false; + mCallbacks.onMouseLeaveFromBottom(); } mCallbacks.onDown(); break; @@ -211,16 +226,35 @@ class SystemGesturesPointerEventListener implements PointerEventListener { break; case MotionEvent.ACTION_HOVER_MOVE: if (event.isFromSource(InputDevice.SOURCE_MOUSE)) { - if (!mMouseHoveringAtEdge && event.getY() == 0) { + final float eventX = event.getX(); + final float eventY = event.getY(); + if (!mMouseHoveringAtLeft && eventX == 0) { + mCallbacks.onMouseHoverAtLeft(); + mMouseHoveringAtLeft = true; + } else if (mMouseHoveringAtLeft && eventX > 0) { + mCallbacks.onMouseLeaveFromLeft(); + mMouseHoveringAtLeft = false; + } + if (!mMouseHoveringAtTop && eventY == 0) { mCallbacks.onMouseHoverAtTop(); - mMouseHoveringAtEdge = true; - } else if (!mMouseHoveringAtEdge && event.getY() >= screenHeight - 1) { + mMouseHoveringAtTop = true; + } else if (mMouseHoveringAtTop && eventY > 0) { + mCallbacks.onMouseLeaveFromTop(); + mMouseHoveringAtTop = false; + } + if (!mMouseHoveringAtRight && eventX >= screenWidth - 1) { + mCallbacks.onMouseHoverAtRight(); + mMouseHoveringAtRight = true; + } else if (mMouseHoveringAtRight && eventX < screenWidth - 1) { + mCallbacks.onMouseLeaveFromRight(); + mMouseHoveringAtRight = false; + } + if (!mMouseHoveringAtBottom && eventY >= screenHeight - 1) { mCallbacks.onMouseHoverAtBottom(); - mMouseHoveringAtEdge = true; - } else if (mMouseHoveringAtEdge - && (event.getY() > 0 && event.getY() < screenHeight - 1)) { - mCallbacks.onMouseLeaveFromEdge(); - mMouseHoveringAtEdge = false; + mMouseHoveringAtBottom = true; + } else if (mMouseHoveringAtBottom && eventY < screenHeight - 1) { + mCallbacks.onMouseLeaveFromBottom(); + mMouseHoveringAtBottom = false; } } break; @@ -373,9 +407,14 @@ class SystemGesturesPointerEventListener implements PointerEventListener { void onFling(int durationMs); void onDown(); void onUpOrCancel(); + void onMouseHoverAtLeft(); void onMouseHoverAtTop(); + void onMouseHoverAtRight(); void onMouseHoverAtBottom(); - void onMouseLeaveFromEdge(); + void onMouseLeaveFromLeft(); + void onMouseLeaveFromTop(); + void onMouseLeaveFromRight(); + void onMouseLeaveFromBottom(); void onDebug(); } }