1 /* 2 * Copyright (C) 2016 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 17 package com.android.documentsui.selection; 18 19 import static com.android.documentsui.testing.TestEvents.Touch.TAP; 20 import static org.junit.Assert.assertEquals; 21 import static org.junit.Assert.assertFalse; 22 import static org.junit.Assert.assertTrue; 23 24 import android.support.annotation.Nullable; 25 import android.support.test.filters.SmallTest; 26 import android.support.test.runner.AndroidJUnit4; 27 import android.support.v7.widget.RecyclerView; 28 import android.view.MotionEvent; 29 30 import com.android.documentsui.selection.SelectionHelper; 31 import com.android.documentsui.selection.ItemDetailsLookup.ItemDetails; 32 import com.android.documentsui.selection.TouchInputHandler.Callbacks; 33 import com.android.documentsui.selection.testing.SelectionHelpers; 34 import com.android.documentsui.selection.testing.SelectionProbe; 35 import com.android.documentsui.selection.testing.TestData; 36 import com.android.documentsui.selection.testing.TestSelectionPredicate; 37 38 import org.junit.Before; 39 import org.junit.Test; 40 import org.junit.runner.RunWith; 41 42 import java.util.List; 43 44 @RunWith(AndroidJUnit4.class) 45 @SmallTest 46 public final class TouchInputHandlerTest { 47 48 private static final List<String> ITEMS = TestData.create(100); 49 50 private TouchInputHandler mInputDelegate; 51 private SelectionHelper mSelectionMgr; 52 private TestSelectionPredicate mSelectionPredicate; 53 private TestRunnable mGestureStarted; 54 private TestCallbacks mCallbacks; 55 private TestItemDetailsLookup mDetailsLookup; 56 private SelectionProbe mSelection; 57 58 @Before 59 public void setUp() { 60 mSelectionMgr = SelectionHelpers.createTestInstance(ITEMS); 61 mDetailsLookup = new TestItemDetailsLookup(); 62 mSelectionPredicate = new TestSelectionPredicate(); 63 mSelection = new SelectionProbe(mSelectionMgr); 64 mGestureStarted = new TestRunnable(); 65 mCallbacks = new TestCallbacks(); 66 67 mInputDelegate = new TouchInputHandler( 68 mSelectionMgr, 69 mDetailsLookup, 70 mSelectionPredicate, 71 mGestureStarted, 72 mCallbacks); 73 } 74 75 @Test 76 public void testTap_ActivatesWhenNoExistingSelection() { 77 ItemDetails doc = mDetailsLookup.initAt(11); 78 mInputDelegate.onSingleTapUp(TAP); 79 80 mCallbacks.assertActivated(doc); 81 } 82 83 @Test 84 public void testScroll_shouldNotBeTrapped() { 85 assertFalse(mInputDelegate.onScroll(null, TAP, -1, -1)); 86 } 87 88 @Test 89 public void testLongPress_SelectsItem() { 90 mSelectionPredicate.setReturnValue(true); 91 92 mDetailsLookup.initAt(7); 93 mInputDelegate.onLongPress(TAP); 94 95 mSelection.assertSelection(7); 96 } 97 98 @Test 99 public void testLongPress_StartsGestureSelection() { 100 mSelectionPredicate.setReturnValue(true); 101 102 mDetailsLookup.initAt(7); 103 mInputDelegate.onLongPress(TAP); 104 mGestureStarted.assertRan(); 105 } 106 107 @Test 108 public void testSelectHotspot_StartsSelectionMode() { 109 mSelectionPredicate.setReturnValue(true); 110 111 mDetailsLookup.initAt(7).setInItemSelectRegion(true); 112 mInputDelegate.onSingleTapUp(TAP); 113 114 mSelection.assertSelection(7); 115 } 116 117 @Test 118 public void testSelectionHotspot_UnselectsSelectedItem() { 119 mSelectionMgr.select("11"); 120 121 mDetailsLookup.initAt(11).setInItemSelectRegion(true); 122 mInputDelegate.onSingleTapUp(TAP); 123 124 mSelection.assertNoSelection(); 125 } 126 127 @Test 128 public void testStartsSelection_PerformsHapticFeedback() { 129 mSelectionPredicate.setReturnValue(true); 130 131 mDetailsLookup.initAt(7); 132 mInputDelegate.onLongPress(TAP); 133 134 mCallbacks.assertVibrated(); 135 } 136 137 @Test 138 public void testLongPress_AddsToSelection() { 139 mSelectionPredicate.setReturnValue(true); 140 141 mDetailsLookup.initAt(7); 142 mInputDelegate.onLongPress(TAP); 143 144 mDetailsLookup.initAt(99); 145 mInputDelegate.onLongPress(TAP); 146 147 mDetailsLookup.initAt(13); 148 mInputDelegate.onLongPress(TAP); 149 150 mSelection.assertSelection(7, 13, 99); 151 } 152 153 @Test 154 public void testTap_UnselectsSelectedItem() { 155 mSelectionMgr.select("11"); 156 157 mDetailsLookup.initAt(11); 158 mInputDelegate.onSingleTapUp(TAP); 159 160 mSelection.assertNoSelection(); 161 } 162 163 @Test 164 public void testTapOff_ClearsSelection() { 165 mSelectionMgr.select("7"); 166 mDetailsLookup.initAt(7); 167 168 mInputDelegate.onLongPress(TAP); 169 170 mSelectionMgr.select("11"); 171 mDetailsLookup.initAt(11); 172 mInputDelegate.onSingleTapUp(TAP); 173 174 mDetailsLookup.initAt(RecyclerView.NO_POSITION).setInItemSelectRegion(false); 175 mInputDelegate.onSingleTapUp(TAP); 176 177 mSelection.assertNoSelection(); 178 } 179 180 private static final class TestCallbacks extends TouchInputHandler.Callbacks { 181 182 private @Nullable ItemDetails mActivated; 183 private boolean mVibrated; 184 185 @Override 186 public boolean onItemActivated(ItemDetails item, MotionEvent e) { 187 mActivated = item; 188 return false; 189 } 190 191 @Override 192 public boolean onDragInitiated(MotionEvent e) { 193 return false; 194 } 195 196 @Override 197 public void onPerformHapticFeedback() { 198 mVibrated = true; 199 } 200 201 private void assertActivated(ItemDetails expected) { 202 assertEquals(expected, mActivated); 203 } 204 205 private void assertVibrated() { 206 assertTrue(mVibrated); 207 } 208 } 209 210 private static final class TestRunnable implements Runnable { 211 212 private boolean mWasRun; 213 214 @Override 215 public void run() { 216 mWasRun = true; 217 } 218 219 void assertRan() { 220 assertTrue(mWasRun); 221 } 222 } 223 } 224