18a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev/*
28a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev * Copyright (C) 2016 The Android Open Source Project
38a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev *
48a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev * Licensed under the Apache License, Version 2.0 (the "License");
58a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev * you may not use this file except in compliance with the License.
68a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev * You may obtain a copy of the License at
78a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev *
88a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev *      http://www.apache.org/licenses/LICENSE-2.0
98a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev *
108a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev * Unless required by applicable law or agreed to in writing, software
118a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev * distributed under the License is distributed on an "AS IS" BASIS,
128a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev * See the License for the specific language governing permissions and
148a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev * limitations under the License.
158a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev */
168a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
178a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheevpackage android.support.v13.view;
188a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
198a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheevimport static org.mockito.Matchers.any;
208a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheevimport static org.mockito.Matchers.argThat;
218a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheevimport static org.mockito.Matchers.eq;
228a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheevimport static org.mockito.Mockito.inOrder;
238a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheevimport static org.mockito.Mockito.mock;
248a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheevimport static org.mockito.Mockito.times;
258a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheevimport static org.mockito.Mockito.verify;
268a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheevimport static org.mockito.Mockito.verifyNoMoreInteractions;
278a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheevimport static org.mockito.Mockito.when;
288a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
298a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheevimport android.app.Instrumentation;
308a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheevimport android.graphics.Point;
318a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheevimport android.os.Build;
328a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheevimport android.os.SystemClock;
338a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheevimport android.support.annotation.NonNull;
348a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheevimport android.support.annotation.RequiresApi;
358a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheevimport android.support.test.InstrumentationRegistry;
3635232c6eaeb9b99f390cb8ef0ac83bf45fa0b3faAurimas Liutikasimport android.support.test.filters.LargeTest;
378a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheevimport android.support.test.filters.SdkSuppress;
388a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheevimport android.support.test.filters.SmallTest;
398a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheevimport android.support.test.rule.ActivityTestRule;
408a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheevimport android.support.test.runner.AndroidJUnit4;
418a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheevimport android.support.v13.test.R;
428a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheevimport android.view.InputDevice;
438a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheevimport android.view.MotionEvent;
448a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheevimport android.view.View;
458a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheevimport android.view.ViewConfiguration;
468a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
478a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheevimport org.hamcrest.Description;
488a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheevimport org.junit.Before;
498a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheevimport org.junit.Rule;
508a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheevimport org.junit.Test;
518a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheevimport org.junit.runner.RunWith;
528a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheevimport org.mockito.ArgumentMatcher;
538a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheevimport org.mockito.InOrder;
548a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
558a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev@RequiresApi(13)
568a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev@RunWith(AndroidJUnit4.class)
578a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheevpublic class DragStartHelperTest {
588a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
598a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    @Rule
608a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    public ActivityTestRule<DragStartHelperTestActivity> mActivityRule =
618a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev            new ActivityTestRule<>(DragStartHelperTestActivity.class);
628a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
638a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    private Instrumentation mInstrumentation;
648a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    private View mDragSource;
658a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
668a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    interface DragStartListener {
678a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        boolean onDragStart(View view, DragStartHelper helper, Point touchPosition);
688a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    }
698a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
708a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    @NonNull
718a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    private DragStartListener createListener(boolean returnValue) {
728a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        final DragStartListener listener = mock(DragStartListener.class);
738a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        when(listener.onDragStart(any(View.class), any(DragStartHelper.class), any(Point.class)))
748a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev                .thenReturn(returnValue);
758a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        return listener;
768a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    }
778a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
788a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    @NonNull
798a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    private DragStartHelper createDragStartHelper(final DragStartListener listener) {
808a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        return new DragStartHelper(mDragSource, new DragStartHelper.OnDragStartListener() {
818a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev            @Override
828a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev            public boolean onDragStart(View v, DragStartHelper helper) {
838a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev                Point touchPosition = new Point();
848a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev                helper.getTouchPosition(touchPosition);
858a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev                return listener.onDragStart(v, helper, touchPosition);
868a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev            }
878a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        });
888a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    }
898a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
908a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    private static int[] getViewCenter(View view) {
918a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        final int[] xy = new int[2];
928a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        view.getLocationOnScreen(xy);
938a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        xy[0] += view.getWidth() / 2;
948a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        xy[1] += view.getHeight() / 2;
958a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        return xy;
968a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    }
978a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
988a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    private static MotionEvent obtainTouchEvent(
998a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev            int action, View anchor, int offsetX, int offsetY) {
1008a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        final long eventTime = SystemClock.uptimeMillis();
1018a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        final int[] xy = getViewCenter(anchor);
1028a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        return MotionEvent.obtain(
1038a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev                eventTime, eventTime, action, xy[0] + offsetX, xy[1] + offsetY, 0);
1048a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    }
1058a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
1068a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    private void sendTouchEvent(int action, View anchor, int offsetX, int offsetY) {
1078a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        mInstrumentation.sendPointerSync(obtainTouchEvent(action, anchor, offsetX, offsetY));
1088a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    }
1098a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
1108a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    private static MotionEvent obtainMouseEvent(
1118a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev            int action, int buttonState, View anchor, int offsetX, int offsetY) {
1128a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        final long eventTime = SystemClock.uptimeMillis();
1138a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
1148a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        final int[] xy = getViewCenter(anchor);
1158a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
1168a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        MotionEvent.PointerProperties[] props = new MotionEvent.PointerProperties[] {
1178a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev                new MotionEvent.PointerProperties()
1188a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        };
1198a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        props[0].id = 0;
1208a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        props[0].toolType = MotionEvent.TOOL_TYPE_MOUSE;
1218a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
1228a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        MotionEvent.PointerCoords[] coords = new MotionEvent.PointerCoords[] {
1238a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev                new MotionEvent.PointerCoords()
1248a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        };
1258a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        coords[0].x = xy[0] + offsetX;
1268a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        coords[0].y = xy[1] + offsetY;
1278a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
1288a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        return MotionEvent.obtain(eventTime, eventTime, action, 1, props, coords, 0,
1298a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev                buttonState, 0, 0, -1, 0, InputDevice.SOURCE_MOUSE, 0);
1308a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    }
1318a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
1328a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    private void sendMouseEvent(
1338a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev            int action, int buttonState, View anchor, int offsetX, int offsetY) {
1348a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        mInstrumentation.sendPointerSync(obtainMouseEvent(
1358a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev                action, buttonState, anchor, offsetX, offsetY));
1368a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    }
1378a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
1388a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    static class TouchPositionMatcher extends ArgumentMatcher<Point> {
1398a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
1408a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        private final Point mExpectedPosition;
1418a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
1428a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        TouchPositionMatcher(int x, int y) {
1438a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev            mExpectedPosition = new Point(x, y);
1448a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        }
1458a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
1468a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        TouchPositionMatcher(View anchor, int x, int y) {
1478a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev            this(anchor.getWidth() / 2 + x, anchor.getHeight() / 2 + y);
1488a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        }
1498a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
150e2104f4b5c8e3ad63570306a25e61502dfe4c418Aurimas Liutikas        @Override
1518a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        public boolean matches(Object actual) {
1528a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev            return mExpectedPosition.equals(actual);
1538a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        }
1548a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
155e2104f4b5c8e3ad63570306a25e61502dfe4c418Aurimas Liutikas        @Override
1568a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        public void describeTo(Description description) {
1578a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev            description.appendText("TouchPositionMatcher: " + mExpectedPosition);
1588a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        }
1598a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    }
1608a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
1618a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    private void waitForLongPress() {
1628a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        SystemClock.sleep(ViewConfiguration.getLongPressTimeout() * 2);
1638a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    }
1648a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
1658a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    @Before
1668a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    public void setUp() {
1678a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        mInstrumentation = InstrumentationRegistry.getInstrumentation();
1688a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        mDragSource = mActivityRule.getActivity().findViewById(R.id.drag_source);
1698a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    }
1708a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
17135232c6eaeb9b99f390cb8ef0ac83bf45fa0b3faAurimas Liutikas    @SmallTest
1728a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.ICE_CREAM_SANDWICH)
1738a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    @Test
17471e918dd8d07e3338240e9a4ca0910814e19c47dVladislav Kaznacheev    public void mouseClick() throws Throwable {
17571e918dd8d07e3338240e9a4ca0910814e19c47dVladislav Kaznacheev        final DragStartListener listener = createListener(true);
17671e918dd8d07e3338240e9a4ca0910814e19c47dVladislav Kaznacheev        final DragStartHelper helper = createDragStartHelper(listener);
17771e918dd8d07e3338240e9a4ca0910814e19c47dVladislav Kaznacheev        helper.attach();
17871e918dd8d07e3338240e9a4ca0910814e19c47dVladislav Kaznacheev
17971e918dd8d07e3338240e9a4ca0910814e19c47dVladislav Kaznacheev        sendMouseEvent(MotionEvent.ACTION_DOWN, MotionEvent.BUTTON_PRIMARY, mDragSource, 0, 0);
18071e918dd8d07e3338240e9a4ca0910814e19c47dVladislav Kaznacheev        sendMouseEvent(MotionEvent.ACTION_UP, MotionEvent.BUTTON_PRIMARY, mDragSource, 0, 0);
18171e918dd8d07e3338240e9a4ca0910814e19c47dVladislav Kaznacheev
18271e918dd8d07e3338240e9a4ca0910814e19c47dVladislav Kaznacheev        // A simple mouse click does not trigger OnDragStart.
18371e918dd8d07e3338240e9a4ca0910814e19c47dVladislav Kaznacheev        verifyNoMoreInteractions(listener);
18471e918dd8d07e3338240e9a4ca0910814e19c47dVladislav Kaznacheev    }
18571e918dd8d07e3338240e9a4ca0910814e19c47dVladislav Kaznacheev
18635232c6eaeb9b99f390cb8ef0ac83bf45fa0b3faAurimas Liutikas    @SmallTest
18771e918dd8d07e3338240e9a4ca0910814e19c47dVladislav Kaznacheev    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.ICE_CREAM_SANDWICH)
18871e918dd8d07e3338240e9a4ca0910814e19c47dVladislav Kaznacheev    @Test
18971e918dd8d07e3338240e9a4ca0910814e19c47dVladislav Kaznacheev    public void mousePressWithSecondaryButton() throws Throwable {
19071e918dd8d07e3338240e9a4ca0910814e19c47dVladislav Kaznacheev        final DragStartListener listener = createListener(true);
19171e918dd8d07e3338240e9a4ca0910814e19c47dVladislav Kaznacheev        final DragStartHelper helper = createDragStartHelper(listener);
19271e918dd8d07e3338240e9a4ca0910814e19c47dVladislav Kaznacheev        helper.attach();
19371e918dd8d07e3338240e9a4ca0910814e19c47dVladislav Kaznacheev
19471e918dd8d07e3338240e9a4ca0910814e19c47dVladislav Kaznacheev        sendMouseEvent(MotionEvent.ACTION_DOWN, MotionEvent.BUTTON_PRIMARY, mDragSource, 0, 0);
19571e918dd8d07e3338240e9a4ca0910814e19c47dVladislav Kaznacheev        sendMouseEvent(MotionEvent.ACTION_MOVE,
19671e918dd8d07e3338240e9a4ca0910814e19c47dVladislav Kaznacheev                MotionEvent.BUTTON_PRIMARY | MotionEvent.BUTTON_SECONDARY, mDragSource, 0, 0);
19771e918dd8d07e3338240e9a4ca0910814e19c47dVladislav Kaznacheev        sendMouseEvent(MotionEvent.ACTION_MOVE, MotionEvent.BUTTON_PRIMARY, mDragSource, 0, 0);
19871e918dd8d07e3338240e9a4ca0910814e19c47dVladislav Kaznacheev
19971e918dd8d07e3338240e9a4ca0910814e19c47dVladislav Kaznacheev        // ACTION_MOVE with the same position does not trigger OnDragStart.
20071e918dd8d07e3338240e9a4ca0910814e19c47dVladislav Kaznacheev        verifyNoMoreInteractions(listener);
20171e918dd8d07e3338240e9a4ca0910814e19c47dVladislav Kaznacheev    }
20271e918dd8d07e3338240e9a4ca0910814e19c47dVladislav Kaznacheev
20335232c6eaeb9b99f390cb8ef0ac83bf45fa0b3faAurimas Liutikas    @SmallTest
20471e918dd8d07e3338240e9a4ca0910814e19c47dVladislav Kaznacheev    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.ICE_CREAM_SANDWICH)
20571e918dd8d07e3338240e9a4ca0910814e19c47dVladislav Kaznacheev    @Test
2068a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    public void mouseDrag() throws Throwable {
2078a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        final DragStartListener listener = createListener(true);
2088a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        final DragStartHelper helper = createDragStartHelper(listener);
2098a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        helper.attach();
2108a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
2118a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        sendMouseEvent(MotionEvent.ACTION_DOWN, MotionEvent.BUTTON_PRIMARY, mDragSource, 0, 0);
2128a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        sendMouseEvent(MotionEvent.ACTION_MOVE, MotionEvent.BUTTON_PRIMARY, mDragSource, 1, 2);
2138a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        sendMouseEvent(MotionEvent.ACTION_MOVE, MotionEvent.BUTTON_PRIMARY, mDragSource, 3, 4);
2148a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        sendMouseEvent(MotionEvent.ACTION_MOVE, MotionEvent.BUTTON_PRIMARY, mDragSource, 5, 6);
2158a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
2168a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        // Returning true from the callback prevents further callbacks.
2178a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        verify(listener, times(1)).onDragStart(
2188a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev                eq(mDragSource), eq(helper), argThat(new TouchPositionMatcher(mDragSource, 1, 2)));
2198a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        verifyNoMoreInteractions(listener);
2208a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    }
2218a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
22235232c6eaeb9b99f390cb8ef0ac83bf45fa0b3faAurimas Liutikas    @SmallTest
2238a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.ICE_CREAM_SANDWICH)
2248a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    @Test
2258a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    public void mouseDragWithNonprimaryButton() throws Throwable {
2268a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        final DragStartListener listener = createListener(true);
2278a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        final DragStartHelper helper = createDragStartHelper(listener);
2288a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        helper.attach();
2298a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
2308a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        sendMouseEvent(MotionEvent.ACTION_DOWN, MotionEvent.BUTTON_SECONDARY, mDragSource, 0, 0);
2318a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        sendMouseEvent(MotionEvent.ACTION_MOVE, MotionEvent.BUTTON_SECONDARY, mDragSource, 1, 2);
2328a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        sendMouseEvent(MotionEvent.ACTION_UP, MotionEvent.BUTTON_SECONDARY, mDragSource, 3, 4);
2338a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
2348a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        sendMouseEvent(MotionEvent.ACTION_DOWN, MotionEvent.BUTTON_TERTIARY, mDragSource, 0, 0);
2358a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        sendMouseEvent(MotionEvent.ACTION_MOVE, MotionEvent.BUTTON_TERTIARY, mDragSource, 1, 2);
2368a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        sendMouseEvent(MotionEvent.ACTION_UP, MotionEvent.BUTTON_TERTIARY, mDragSource, 3, 4);
2378a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
23871e918dd8d07e3338240e9a4ca0910814e19c47dVladislav Kaznacheev        // Dragging mouse with a non-primary button down does not trigger OnDragStart.
2398a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        verifyNoMoreInteractions(listener);
2408a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    }
2418a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
24235232c6eaeb9b99f390cb8ef0ac83bf45fa0b3faAurimas Liutikas    @SmallTest
2438a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.ICE_CREAM_SANDWICH)
2448a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    @Test
2458a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    public void mouseDragUsingTouchListener() throws Throwable {
2468a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        final DragStartListener listener = createListener(true);
2478a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        final DragStartHelper helper = createDragStartHelper(listener);
2488a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
2498a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        mDragSource.setOnTouchListener(new View.OnTouchListener() {
2508a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev            @Override
2518a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev            public boolean onTouch(View view, MotionEvent motionEvent) {
2528a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev                helper.onTouch(view, motionEvent);
2538a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev                return true;
2548a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev            }
2558a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        });
2568a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
2578a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        sendMouseEvent(MotionEvent.ACTION_DOWN, MotionEvent.BUTTON_PRIMARY, mDragSource, 0, 0);
2588a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        sendMouseEvent(MotionEvent.ACTION_MOVE, MotionEvent.BUTTON_PRIMARY, mDragSource, 1, 2);
2598a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        sendMouseEvent(MotionEvent.ACTION_MOVE, MotionEvent.BUTTON_PRIMARY, mDragSource, 3, 4);
2608a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        sendMouseEvent(MotionEvent.ACTION_MOVE, MotionEvent.BUTTON_PRIMARY, mDragSource, 5, 6);
2618a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
2628a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        // Returning true from the callback prevents further callbacks.
2638a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        verify(listener, times(1)).onDragStart(
2648a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev                eq(mDragSource), eq(helper), argThat(new TouchPositionMatcher(mDragSource, 1, 2)));
2658a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        verifyNoMoreInteractions(listener);
2668a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    }
2678a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
26835232c6eaeb9b99f390cb8ef0ac83bf45fa0b3faAurimas Liutikas    @SmallTest
2698a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.ICE_CREAM_SANDWICH)
2708a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    @Test
2718a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    public void mouseDragWhenListenerReturnsFalse() throws Throwable {
2728a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        final DragStartListener listener = createListener(false);
2738a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        final DragStartHelper helper = createDragStartHelper(listener);
2748a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        helper.attach();
2758a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
2768a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        sendMouseEvent(MotionEvent.ACTION_DOWN, MotionEvent.BUTTON_PRIMARY, mDragSource, 0, 0);
2778a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        sendMouseEvent(MotionEvent.ACTION_MOVE, MotionEvent.BUTTON_PRIMARY, mDragSource, 1, 2);
2788a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        sendMouseEvent(MotionEvent.ACTION_MOVE, MotionEvent.BUTTON_PRIMARY, mDragSource, 3, 4);
2798a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        sendMouseEvent(MotionEvent.ACTION_MOVE, MotionEvent.BUTTON_PRIMARY, mDragSource, 5, 6);
2808a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
2818a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        // When the listener returns false every ACTION_MOVE triggers OnDragStart.
2828a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        InOrder inOrder = inOrder(listener);
2838a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        inOrder.verify(listener, times(1)).onDragStart(
2848a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev                eq(mDragSource), eq(helper), argThat(new TouchPositionMatcher(mDragSource, 1, 2)));
2858a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        inOrder.verify(listener, times(1)).onDragStart(
2868a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev                eq(mDragSource), eq(helper), argThat(new TouchPositionMatcher(mDragSource, 3, 4)));
2878a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        inOrder.verify(listener, times(1)).onDragStart(
2888a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev                eq(mDragSource), eq(helper), argThat(new TouchPositionMatcher(mDragSource, 5, 6)));
2898a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        inOrder.verifyNoMoreInteractions();
2908a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    }
2918a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
29235232c6eaeb9b99f390cb8ef0ac83bf45fa0b3faAurimas Liutikas    @LargeTest
2938a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.ICE_CREAM_SANDWICH)
2948a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    @Test
2958a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    public void mouseLongPress() throws Throwable {
2968a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        final DragStartListener listener = createListener(true);
2978a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        final DragStartHelper helper = createDragStartHelper(listener);
2988a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        helper.attach();
2998a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
3008a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        sendMouseEvent(MotionEvent.ACTION_DOWN, MotionEvent.BUTTON_PRIMARY, mDragSource, 1, 2);
3018a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        waitForLongPress();
3028a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
3038a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        // Long press triggers OnDragStart.
3048a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        verify(listener, times(1)).onDragStart(
3058a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev                eq(mDragSource), eq(helper), argThat(new TouchPositionMatcher(mDragSource, 1, 2)));
3068a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        verifyNoMoreInteractions(listener);
3078a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    }
3088a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
30935232c6eaeb9b99f390cb8ef0ac83bf45fa0b3faAurimas Liutikas    @SmallTest
3108a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    @Test
3118a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    public void touchDrag() throws Throwable {
3128a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        final DragStartListener listener = createListener(false);
3138a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        final DragStartHelper helper = createDragStartHelper(listener);
3148a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        helper.attach();
3158a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
3168a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        sendTouchEvent(MotionEvent.ACTION_DOWN, mDragSource, 0, 0);
3178a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        sendTouchEvent(MotionEvent.ACTION_MOVE, mDragSource, 1, 2);
3188a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        sendTouchEvent(MotionEvent.ACTION_MOVE, mDragSource, 3, 4);
3198a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        sendTouchEvent(MotionEvent.ACTION_MOVE, mDragSource, 5, 6);
3208a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
3218a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        // Touch and drag (without delay) does not trigger OnDragStart.
3228a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        verifyNoMoreInteractions(listener);
3238a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    }
3248a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
32535232c6eaeb9b99f390cb8ef0ac83bf45fa0b3faAurimas Liutikas    @SmallTest
3268a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    @Test
32771e918dd8d07e3338240e9a4ca0910814e19c47dVladislav Kaznacheev    public void touchTap() throws Throwable {
32871e918dd8d07e3338240e9a4ca0910814e19c47dVladislav Kaznacheev        final DragStartListener listener = createListener(false);
32971e918dd8d07e3338240e9a4ca0910814e19c47dVladislav Kaznacheev        final DragStartHelper helper = createDragStartHelper(listener);
33071e918dd8d07e3338240e9a4ca0910814e19c47dVladislav Kaznacheev        helper.attach();
33171e918dd8d07e3338240e9a4ca0910814e19c47dVladislav Kaznacheev
33271e918dd8d07e3338240e9a4ca0910814e19c47dVladislav Kaznacheev        sendTouchEvent(MotionEvent.ACTION_DOWN, mDragSource, 0, 0);
33371e918dd8d07e3338240e9a4ca0910814e19c47dVladislav Kaznacheev        sendTouchEvent(MotionEvent.ACTION_UP, mDragSource, 0, 0);
33471e918dd8d07e3338240e9a4ca0910814e19c47dVladislav Kaznacheev
33571e918dd8d07e3338240e9a4ca0910814e19c47dVladislav Kaznacheev        // A simple tap does not trigger OnDragStart.
33671e918dd8d07e3338240e9a4ca0910814e19c47dVladislav Kaznacheev        verifyNoMoreInteractions(listener);
33771e918dd8d07e3338240e9a4ca0910814e19c47dVladislav Kaznacheev    }
33871e918dd8d07e3338240e9a4ca0910814e19c47dVladislav Kaznacheev
33935232c6eaeb9b99f390cb8ef0ac83bf45fa0b3faAurimas Liutikas    @LargeTest
34071e918dd8d07e3338240e9a4ca0910814e19c47dVladislav Kaznacheev    @Test
3418a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    public void touchLongPress() throws Throwable {
3428a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        final DragStartListener listener = createListener(true);
3438a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        final DragStartHelper helper = createDragStartHelper(listener);
3448a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        helper.attach();
3458a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
3468a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        sendTouchEvent(MotionEvent.ACTION_DOWN, mDragSource, 1, 2);
3478a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        waitForLongPress();
3488a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
3498a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        // Long press triggers OnDragStart.
3508a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        verify(listener, times(1)).onDragStart(
3518a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev                eq(mDragSource), eq(helper), argThat(new TouchPositionMatcher(mDragSource, 1, 2)));
3528a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        verifyNoMoreInteractions(listener);
3538a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    }
3548a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
35535232c6eaeb9b99f390cb8ef0ac83bf45fa0b3faAurimas Liutikas    @LargeTest
3568a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    @Test
3578a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    public void touchLongPressUsingLongClickListener() throws Throwable {
3588a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        final DragStartListener listener = createListener(true);
3598a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
3608a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        final DragStartHelper helper = createDragStartHelper(listener);
3618a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        mDragSource.setOnLongClickListener(new View.OnLongClickListener() {
3628a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev            @Override
3638a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev            public boolean onLongClick(View view) {
3648a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev                return helper.onLongClick(view);
3658a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev            }
3668a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        });
3678a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
3688a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        sendTouchEvent(MotionEvent.ACTION_DOWN, mDragSource, 1, 2);
3698a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        waitForLongPress();
3708a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev
3718a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        // Long press triggers OnDragStart.
3728a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        // Since ACTION_DOWN is not handled, the touch offset is not available.
3738a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        verify(listener, times(1)).onDragStart(
3748a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev                eq(mDragSource), eq(helper), argThat(new TouchPositionMatcher(0, 0)));
3758a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev        verifyNoMoreInteractions(listener);
3768a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev    }
3778a771cded580e2b83a0eb158cae7ee13ce0b85cdVladislav Kaznacheev}
378