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