• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
setUp()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
testTap_ActivatesWhenNoExistingSelection()76     public void testTap_ActivatesWhenNoExistingSelection() {
77         ItemDetails doc = mDetailsLookup.initAt(11);
78         mInputDelegate.onSingleTapUp(TAP);
79 
80         mCallbacks.assertActivated(doc);
81     }
82 
83     @Test
testScroll_shouldNotBeTrapped()84     public void testScroll_shouldNotBeTrapped() {
85         assertFalse(mInputDelegate.onScroll(null, TAP, -1, -1));
86     }
87 
88     @Test
testLongPress_SelectsItem()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
testLongPress_StartsGestureSelection()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
testSelectHotspot_StartsSelectionMode()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
testSelectionHotspot_UnselectsSelectedItem()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
testStartsSelection_PerformsHapticFeedback()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
testLongPress_AddsToSelection()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
testTap_UnselectsSelectedItem()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
testTapOff_ClearsSelection()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
onItemActivated(ItemDetails item, MotionEvent e)186         public boolean onItemActivated(ItemDetails item, MotionEvent e) {
187             mActivated = item;
188             return false;
189         }
190 
191         @Override
onDragInitiated(MotionEvent e)192         public boolean onDragInitiated(MotionEvent e) {
193             return false;
194         }
195 
196         @Override
onPerformHapticFeedback()197         public void onPerformHapticFeedback() {
198             mVibrated = true;
199         }
200 
assertActivated(ItemDetails expected)201         private void assertActivated(ItemDetails expected) {
202             assertEquals(expected, mActivated);
203         }
204 
assertVibrated()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
run()215         public void run() {
216             mWasRun = true;
217         }
218 
assertRan()219         void assertRan() {
220             assertTrue(mWasRun);
221         }
222     }
223 }
224