Merge "Run HOVER_EXIT event only if there's no BUTTON_PRESS event after." into rvc-dev
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user