1 /* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package com.android.launcher3.touch; 17 18 import android.support.test.InstrumentationRegistry; 19 import android.support.test.filters.SmallTest; 20 import android.support.test.runner.AndroidJUnit4; 21 import android.util.Log; 22 import android.view.MotionEvent; 23 import android.view.ViewConfiguration; 24 25 import com.android.launcher3.testcomponent.TouchEventGenerator; 26 27 import org.junit.Before; 28 import org.junit.Test; 29 import org.junit.runner.RunWith; 30 import org.mockito.Mock; 31 import org.mockito.MockitoAnnotations; 32 33 import static org.mockito.Matchers.anyBoolean; 34 import static org.mockito.Matchers.anyFloat; 35 import static org.mockito.Mockito.never; 36 import static org.mockito.Mockito.verify; 37 38 @SmallTest 39 @RunWith(AndroidJUnit4.class) 40 public class SwipeDetectorTest { 41 42 private static final String TAG = SwipeDetectorTest.class.getSimpleName(); L(String s, Object... parts)43 public static void L(String s, Object... parts) { 44 Log.d(TAG, (parts.length == 0) ? s : String.format(s, parts)); 45 } 46 47 private TouchEventGenerator mGenerator; 48 private SwipeDetector mDetector; 49 private int mTouchSlop; 50 51 @Mock 52 private SwipeDetector.Listener mMockListener; 53 54 @Before setup()55 public void setup() { 56 MockitoAnnotations.initMocks(this); 57 mGenerator = new TouchEventGenerator(new TouchEventGenerator.Listener() { 58 @Override 59 public void onTouchEvent(MotionEvent event) { 60 mDetector.onTouchEvent(event); 61 } 62 }); 63 64 mDetector = new SwipeDetector(mTouchSlop, mMockListener, SwipeDetector.VERTICAL); 65 mDetector.setDetectableScrollConditions(SwipeDetector.DIRECTION_BOTH, false); 66 mTouchSlop = ViewConfiguration.get(InstrumentationRegistry.getTargetContext()) 67 .getScaledTouchSlop(); 68 L("mTouchSlop=", mTouchSlop); 69 } 70 71 @Test testDragStart_vertical()72 public void testDragStart_vertical() throws Exception { 73 mGenerator.put(0, 100, 100); 74 mGenerator.move(0, 100, 100 + mTouchSlop); 75 // TODO: actually calculate the following parameters and do exact value checks. 76 verify(mMockListener).onDragStart(anyBoolean()); 77 } 78 79 @Test testDragStart_failed()80 public void testDragStart_failed() throws Exception { 81 mGenerator.put(0, 100, 100); 82 mGenerator.move(0, 100 + mTouchSlop, 100); 83 // TODO: actually calculate the following parameters and do exact value checks. 84 verify(mMockListener, never()).onDragStart(anyBoolean()); 85 } 86 87 @Test testDragStart_horizontal()88 public void testDragStart_horizontal() throws Exception { 89 mDetector = new SwipeDetector(mTouchSlop, mMockListener, SwipeDetector.HORIZONTAL); 90 mDetector.setDetectableScrollConditions(SwipeDetector.DIRECTION_BOTH, false); 91 92 mGenerator.put(0, 100, 100); 93 mGenerator.move(0, 100 + mTouchSlop, 100); 94 // TODO: actually calculate the following parameters and do exact value checks. 95 verify(mMockListener).onDragStart(anyBoolean()); 96 } 97 98 @Test testDrag()99 public void testDrag() throws Exception { 100 mGenerator.put(0, 100, 100); 101 mGenerator.move(0, 100, 100 + mTouchSlop); 102 // TODO: actually calculate the following parameters and do exact value checks. 103 verify(mMockListener).onDrag(anyFloat(), anyFloat()); 104 } 105 106 @Test testDragEnd()107 public void testDragEnd() throws Exception { 108 mGenerator.put(0, 100, 100); 109 mGenerator.move(0, 100, 100 + mTouchSlop); 110 mGenerator.move(0, 100, 100 + mTouchSlop * 2); 111 mGenerator.lift(0); 112 // TODO: actually calculate the following parameters and do exact value checks. 113 verify(mMockListener).onDragEnd(anyFloat(), anyBoolean()); 114 } 115 } 116