diff options
| author | 2020-07-06 21:39:54 +0000 | |
|---|---|---|
| committer | 2020-07-06 21:39:54 +0000 | |
| commit | a9914ea6df503f7e23ca26281e8ee5f2e7b3acf6 (patch) | |
| tree | 1ec929ab2f6b3dc9b7b54061b576eb7e4f929ede | |
| parent | 972ace00d090c467b94a16de27805bcd1fab5a4d (diff) | |
| parent | e01198edec9cf9da844705d8c54d717f9319215a (diff) | |
Merge "Run HOVER_EXIT event only if there's no BUTTON_PRESS event after." into rvc-dev am: e01198edec
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/12049437
Change-Id: Ia1cf052b7b1b508e3037c781a285cb16f75e2036
3 files changed, 55 insertions, 3 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java index b6e4e1628c20..d7cc11b7fd15 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java +++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java @@ -242,7 +242,8 @@ public class PipTouchHandler { this::updateMovementBounds, sysUiState); mTouchState = new PipTouchState(ViewConfiguration.get(context), mHandler, () -> mMenuController.showMenuWithDelay(MENU_STATE_FULL, mMotionHelper.getBounds(), - true /* allowMenuTimeout */, willResizeMenu(), shouldShowResizeHandle())); + true /* allowMenuTimeout */, willResizeMenu(), shouldShowResizeHandle()), + menuController::hideMenu); Resources res = context.getResources(); mEnableDismissDragToEdge = res.getBoolean(R.bool.config_pipEnableDismissDragToEdge); @@ -708,6 +709,7 @@ public class PipTouchHandler { // on and changing MotionEvents into HoverEvents. // Let's not enable menu show/hide for a11y services. if (!mAccessibilityManager.isTouchExplorationEnabled()) { + mTouchState.removeHoverExitTimeoutCallback(); mMenuController.showMenu(MENU_STATE_FULL, mMotionHelper.getBounds(), false /* allowMenuTimeout */, false /* willResizeMenu */, shouldShowResizeHandle()); @@ -725,7 +727,7 @@ public class PipTouchHandler { // Let's not enable menu show/hide for a11y services. if (!mAccessibilityManager.isTouchExplorationEnabled()) { mHideMenuAfterShown = true; - mMenuController.hideMenu(); + mTouchState.scheduleHoverExitTimeoutCallback(); } if (!shouldDeliverToMenu && mSendingHoverAccessibilityEvents) { sendAccessibilityHoverEvent(AccessibilityEvent.TYPE_VIEW_HOVER_EXIT); diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchState.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchState.java index 132c04d381dd..ecd1128a5680 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchState.java +++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchState.java @@ -36,10 +36,12 @@ public class PipTouchState { @VisibleForTesting static final long DOUBLE_TAP_TIMEOUT = 200; + static final long HOVER_EXIT_TIMEOUT = 50; private final Handler mHandler; private final ViewConfiguration mViewConfig; private final Runnable mDoubleTapTimeoutCallback; + private final Runnable mHoverExitTimeoutCallback; private VelocityTracker mVelocityTracker; private long mDownTouchTime = 0; @@ -64,10 +66,11 @@ public class PipTouchState { private int mActivePointerId; public PipTouchState(ViewConfiguration viewConfig, Handler handler, - Runnable doubleTapTimeoutCallback) { + Runnable doubleTapTimeoutCallback, Runnable hoverExitTimeoutCallback) { mViewConfig = viewConfig; mHandler = handler; mDoubleTapTimeoutCallback = doubleTapTimeoutCallback; + mHoverExitTimeoutCallback = hoverExitTimeoutCallback; } /** @@ -197,6 +200,10 @@ public class PipTouchState { recycleVelocityTracker(); break; } + case MotionEvent.ACTION_BUTTON_PRESS: { + removeHoverExitTimeoutCallback(); + break; + } } } @@ -326,6 +333,15 @@ public class PipTouchState { mHandler.removeCallbacks(mDoubleTapTimeoutCallback); } + void scheduleHoverExitTimeoutCallback() { + mHandler.removeCallbacks(mHoverExitTimeoutCallback); + mHandler.postDelayed(mHoverExitTimeoutCallback, HOVER_EXIT_TIMEOUT); + } + + void removeHoverExitTimeoutCallback() { + mHandler.removeCallbacks(mHoverExitTimeoutCallback); + } + void addMovementToVelocityTracker(MotionEvent event) { if (mVelocityTracker == null) { return; diff --git a/packages/SystemUI/tests/src/com/android/systemui/pip/phone/PipTouchStateTest.java b/packages/SystemUI/tests/src/com/android/systemui/pip/phone/PipTouchStateTest.java index 3155e57d8ab3..17b2e3225200 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/pip/phone/PipTouchStateTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/pip/phone/PipTouchStateTest.java @@ -16,6 +16,7 @@ package com.android.systemui.pip.phone; +import static android.view.MotionEvent.ACTION_BUTTON_PRESS; import static android.view.MotionEvent.ACTION_DOWN; import static android.view.MotionEvent.ACTION_MOVE; import static android.view.MotionEvent.ACTION_UP; @@ -49,13 +50,17 @@ public class PipTouchStateTest extends SysuiTestCase { private PipTouchState mTouchState; private CountDownLatch mDoubleTapCallbackTriggeredLatch; + private CountDownLatch mHoverExitCallbackTriggeredLatch; @Before public void setUp() throws Exception { mDoubleTapCallbackTriggeredLatch = new CountDownLatch(1); + mHoverExitCallbackTriggeredLatch = new CountDownLatch(1); mTouchState = new PipTouchState(ViewConfiguration.get(getContext()), Handler.createAsync(Looper.myLooper()), () -> { mDoubleTapCallbackTriggeredLatch.countDown(); + }, () -> { + mHoverExitCallbackTriggeredLatch.countDown(); }); assertFalse(mTouchState.isDoubleTap()); assertFalse(mTouchState.isWaitingForDoubleTap()); @@ -120,6 +125,35 @@ public class PipTouchStateTest extends SysuiTestCase { assertTrue(mTouchState.getDoubleTapTimeoutCallbackDelay() == -1); } + @Test + public void testHoverExitTimeout_timeoutCallbackCalled() throws Exception { + mTouchState.scheduleHoverExitTimeoutCallback(); + + // TODO: Remove this sleep. Its only being added because it speeds up this test a bit. + Thread.sleep(50); + TestableLooper.get(this).processAllMessages(); + assertTrue(mHoverExitCallbackTriggeredLatch.getCount() == 0); + } + + @Test + public void testHoverExitTimeout_timeoutCallbackNotCalled() throws Exception { + mTouchState.scheduleHoverExitTimeoutCallback(); + TestableLooper.get(this).processAllMessages(); + assertTrue(mHoverExitCallbackTriggeredLatch.getCount() == 1); + } + + @Test + public void testHoverExitTimeout_timeoutCallbackNotCalled_ifButtonPress() throws Exception { + mTouchState.scheduleHoverExitTimeoutCallback(); + mTouchState.onTouchEvent(createMotionEvent(ACTION_BUTTON_PRESS, SystemClock.uptimeMillis(), + 0, 0)); + + // TODO: Remove this sleep. Its only being added because it speeds up this test a bit. + Thread.sleep(50); + TestableLooper.get(this).processAllMessages(); + assertTrue(mHoverExitCallbackTriggeredLatch.getCount() == 1); + } + private MotionEvent createMotionEvent(int action, long eventTime, float x, float y) { return MotionEvent.obtain(0, eventTime, action, x, y, 0); } |