12d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay/* 22d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay * Copyright (C) 2016 The Android Open Source Project 32d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay * 42d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay * Licensed under the Apache License, Version 2.0 (the "License"); 52d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay * you may not use this file except in compliance with the License. 62d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay * You may obtain a copy of the License at 72d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay * 82d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay * http://www.apache.org/licenses/LICENSE-2.0 92d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay * 102d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay * Unless required by applicable law or agreed to in writing, software 112d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay * distributed under the License is distributed on an "AS IS" BASIS, 122d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay * See the License for the specific language governing permissions and 142d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay * limitations under the License. 152d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay */ 162d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay 172d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKaypackage com.android.documentsui.dirlist; 182d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay 1935f99e02f3fa8af21139be216fc57c123779808dBen Linimport static org.junit.Assert.assertFalse; 2035f99e02f3fa8af21139be216fc57c123779808dBen Lin 212d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKayimport android.support.test.filters.SmallTest; 222d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKayimport android.support.test.runner.AndroidJUnit4; 232d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKayimport android.support.v7.widget.RecyclerView; 242d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKayimport android.view.MotionEvent; 252d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay 26d9caa6ab53aa784acaf241c0ded3c4ae2d342bf8Steve McKayimport com.android.documentsui.base.Events.InputEvent; 274f78ba643270b9d84da1952d8e408220b25ec6fdSteve McKayimport com.android.documentsui.selection.SelectionManager; 28bd9f05aa36bf19d8b34d0d73a59e9bd65d3d26ebSteve McKayimport com.android.documentsui.selection.SelectionProbe; 295b0a2c187a9e446b683687817d22cbe443585223Steve McKayimport com.android.documentsui.testing.SelectionManagers; 306d20d190bc576bea1da48f79d868a5f383d3458bSteve McKayimport com.android.documentsui.testing.TestActionHandler; 312d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKayimport com.android.documentsui.testing.TestEvent; 322d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKayimport com.android.documentsui.testing.TestEvent.Builder; 33990f76ea83a249cd8fc3c797e40626b94cd7945cSteve McKayimport com.android.documentsui.testing.TestEventHandler; 342d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKayimport com.android.documentsui.testing.TestPredicate; 352d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay 362d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKayimport org.junit.Before; 372d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKayimport org.junit.Test; 382d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKayimport org.junit.runner.RunWith; 392d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay 402d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKayimport java.util.List; 412d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay 422d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay@RunWith(AndroidJUnit4.class) 432d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay@SmallTest 442d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKaypublic final class UserInputHandler_TouchTest { 452d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay 462d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay private static final List<String> ITEMS = TestData.create(100); 472d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay 482d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay private UserInputHandler<TestEvent> mInputHandler; 496d20d190bc576bea1da48f79d868a5f383d3458bSteve McKay private TestActionHandler mActionHandler; 502d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay 512d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay private SelectionProbe mSelection; 522d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay private TestPredicate<DocumentDetails> mCanSelect; 53990f76ea83a249cd8fc3c797e40626b94cd7945cSteve McKay private TestEventHandler<InputEvent> mRightClickHandler; 54990f76ea83a249cd8fc3c797e40626b94cd7945cSteve McKay private TestEventHandler<InputEvent> mDragAndDropHandler; 55990f76ea83a249cd8fc3c797e40626b94cd7945cSteve McKay private TestEventHandler<InputEvent> mGestureSelectHandler; 5611a2c1338f07cc0afd60e7ac6ea6ba505b80dadbBen Lin private TestEventHandler<Void> mPerformHapticFeedback; 572d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay 582d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay private Builder mEvent; 592d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay 602d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay @Before 612d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay public void setUp() { 625b0a2c187a9e446b683687817d22cbe443585223Steve McKay SelectionManager selectionMgr = SelectionManagers.createTestInstance(ITEMS); 632d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay 646d20d190bc576bea1da48f79d868a5f383d3458bSteve McKay mActionHandler = new TestActionHandler(); 656d20d190bc576bea1da48f79d868a5f383d3458bSteve McKay 662d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay mSelection = new SelectionProbe(selectionMgr); 672d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay mCanSelect = new TestPredicate<>(); 68990f76ea83a249cd8fc3c797e40626b94cd7945cSteve McKay mRightClickHandler = new TestEventHandler<>(); 69990f76ea83a249cd8fc3c797e40626b94cd7945cSteve McKay mDragAndDropHandler = new TestEventHandler<>(); 70990f76ea83a249cd8fc3c797e40626b94cd7945cSteve McKay mGestureSelectHandler = new TestEventHandler<>(); 7111a2c1338f07cc0afd60e7ac6ea6ba505b80dadbBen Lin mPerformHapticFeedback = new TestEventHandler<>(); 722d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay 732d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay mInputHandler = new UserInputHandler<>( 746d20d190bc576bea1da48f79d868a5f383d3458bSteve McKay mActionHandler, 752d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay new TestFocusHandler(), 766d20d190bc576bea1da48f79d868a5f383d3458bSteve McKay selectionMgr, 772d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay (MotionEvent event) -> { 782d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay throw new UnsupportedOperationException("Not exercised in tests."); 792d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay }, 802d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay mCanSelect, 81990f76ea83a249cd8fc3c797e40626b94cd7945cSteve McKay mRightClickHandler::accept, 82990f76ea83a249cd8fc3c797e40626b94cd7945cSteve McKay mDragAndDropHandler::accept, 8311a2c1338f07cc0afd60e7ac6ea6ba505b80dadbBen Lin mGestureSelectHandler::accept, 8411a2c1338f07cc0afd60e7ac6ea6ba505b80dadbBen Lin () -> mPerformHapticFeedback.accept(null)); 852d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay 862d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay mEvent = TestEvent.builder(); 872d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay } 882d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay 892d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay @Test 902d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay public void testTap_ActivatesWhenNoExistingSelection() { 912d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay mInputHandler.onSingleTapUp(mEvent.at(11).build()); 926d20d190bc576bea1da48f79d868a5f383d3458bSteve McKay mActionHandler.open.assertLastArgument(mEvent.build().getDocumentDetails()); 932d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay } 942d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay 952d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay @Test 9635f99e02f3fa8af21139be216fc57c123779808dBen Lin public void testScroll_shouldNotBeTrapped() { 9735f99e02f3fa8af21139be216fc57c123779808dBen Lin assertFalse(mInputHandler.onScroll(mEvent.build())); 9835f99e02f3fa8af21139be216fc57c123779808dBen Lin } 9935f99e02f3fa8af21139be216fc57c123779808dBen Lin 10035f99e02f3fa8af21139be216fc57c123779808dBen Lin @Test 1012d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay public void testLongPress_StartsSelectionMode() { 10211a2c1338f07cc0afd60e7ac6ea6ba505b80dadbBen Lin mCanSelect.nextReturn(true); 10311a2c1338f07cc0afd60e7ac6ea6ba505b80dadbBen Lin TestEvent event = mEvent.at(7).build(); 10411a2c1338f07cc0afd60e7ac6ea6ba505b80dadbBen Lin mInputHandler.onLongPress(event); 1052d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay mSelection.assertSelection(7); 10611a2c1338f07cc0afd60e7ac6ea6ba505b80dadbBen Lin mPerformHapticFeedback.assertCalled(); 1072d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay } 1082d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay 1092d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay @Test 11011a2c1338f07cc0afd60e7ac6ea6ba505b80dadbBen Lin public void testLongPress_SecondPressAddsSelection() { 11111a2c1338f07cc0afd60e7ac6ea6ba505b80dadbBen Lin mCanSelect.nextReturn(true); 11211a2c1338f07cc0afd60e7ac6ea6ba505b80dadbBen Lin TestEvent event1 = mEvent.at(7).build(); 11311a2c1338f07cc0afd60e7ac6ea6ba505b80dadbBen Lin TestEvent event2 = mEvent.at(99).build(); 11411a2c1338f07cc0afd60e7ac6ea6ba505b80dadbBen Lin TestEvent event3 = mEvent.at(13).build(); 11511a2c1338f07cc0afd60e7ac6ea6ba505b80dadbBen Lin mInputHandler.onLongPress(event1); 11611a2c1338f07cc0afd60e7ac6ea6ba505b80dadbBen Lin mPerformHapticFeedback.assertCalled(); 11711a2c1338f07cc0afd60e7ac6ea6ba505b80dadbBen Lin mPerformHapticFeedback.reset(); 11811a2c1338f07cc0afd60e7ac6ea6ba505b80dadbBen Lin mInputHandler.onLongPress(event2); 11911a2c1338f07cc0afd60e7ac6ea6ba505b80dadbBen Lin mPerformHapticFeedback.assertCalled(); 12011a2c1338f07cc0afd60e7ac6ea6ba505b80dadbBen Lin mPerformHapticFeedback.reset(); 12111a2c1338f07cc0afd60e7ac6ea6ba505b80dadbBen Lin mInputHandler.onLongPress(event3); 12211a2c1338f07cc0afd60e7ac6ea6ba505b80dadbBen Lin mPerformHapticFeedback.assertCalled(); 12311a2c1338f07cc0afd60e7ac6ea6ba505b80dadbBen Lin mPerformHapticFeedback.reset(); 1242d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay mSelection.assertSelection(7, 13, 99); 1252d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay } 1262d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay 1272d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay @Test 1282d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay public void testTap_UnselectsSelectedItem() { 1292d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay mInputHandler.onLongPress(mEvent.at(7).build()); 1302d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay mInputHandler.onSingleTapUp(mEvent.at(7).build()); 1312d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay mSelection.assertNoSelection(); 1322d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay } 1332d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay 1342d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay @Test 1352d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay public void testTapOff_ClearsSelection() { 1362d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay mInputHandler.onLongPress(mEvent.at(7).build()); 1372d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay mInputHandler.onSingleTapUp(mEvent.at(11).build()); 1382d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay mInputHandler.onSingleTapUp(mEvent.at(RecyclerView.NO_POSITION).build()); 1392d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay mSelection.assertNoSelection(); 1402d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay } 1412d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay} 142