Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e3302b4f authored by Ben Lin's avatar Ben Lin Committed by Automerger Merge Worker
Browse files

Merge "Run HOVER_EXIT event only if there's no BUTTON_PRESS event after." into...

Merge "Run HOVER_EXIT event only if there's no BUTTON_PRESS event after." into rvc-dev am: e01198ed am: a9914ea6

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/12049437

Change-Id: Ib934fd0326d2d3aa205f2c276dd83c5d5d117dcc
parents e0ba52c7 a9914ea6
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -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);
+17 −1
Original line number Diff line number Diff line
@@ -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;
+34 −0
Original line number Diff line number Diff line
@@ -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);
    }