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