174956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay/*
274956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay * Copyright (C) 2016 The Android Open Source Project
374956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay *
474956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay * Licensed under the Apache License, Version 2.0 (the "License");
574956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay * you may not use this file except in compliance with the License.
674956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay * You may obtain a copy of the License at
774956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay *
874956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay *      http://www.apache.org/licenses/LICENSE-2.0
974956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay *
1074956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay * Unless required by applicable law or agreed to in writing, software
1174956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay * distributed under the License is distributed on an "AS IS" BASIS,
1274956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1374956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay * See the License for the specific language governing permissions and
1474956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay * limitations under the License.
1574956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay */
1674956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay
1774956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKaypackage com.android.documentsui.dirlist;
1874956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay
19f88bc0b6f1945db1eb11afcfb15bc2c08b13ba9fBen Linimport static org.junit.Assert.assertFalse;
2035f99e02f3fa8af21139be216fc57c123779808dBen Linimport static org.junit.Assert.assertTrue;
2135f99e02f3fa8af21139be216fc57c123779808dBen Lin
2274956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKayimport android.support.test.filters.SmallTest;
2374956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKayimport android.support.test.runner.AndroidJUnit4;
242d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKayimport android.support.v7.widget.RecyclerView;
2574956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKayimport android.view.MotionEvent;
2674956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay
27d9caa6ab53aa784acaf241c0ded3c4ae2d342bf8Steve McKayimport com.android.documentsui.base.Events.InputEvent;
284f78ba643270b9d84da1952d8e408220b25ec6fdSteve McKayimport com.android.documentsui.selection.SelectionManager;
29bd9f05aa36bf19d8b34d0d73a59e9bd65d3d26ebSteve McKayimport com.android.documentsui.selection.SelectionProbe;
305b0a2c187a9e446b683687817d22cbe443585223Steve McKayimport com.android.documentsui.testing.SelectionManagers;
316d20d190bc576bea1da48f79d868a5f383d3458bSteve McKayimport com.android.documentsui.testing.TestActionHandler;
322d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKayimport com.android.documentsui.testing.TestEvent;
332d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKayimport com.android.documentsui.testing.TestEvent.Builder;
34990f76ea83a249cd8fc3c797e40626b94cd7945cSteve McKayimport com.android.documentsui.testing.TestEventHandler;
3574956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKayimport com.android.documentsui.testing.TestPredicate;
3674956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay
3774956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKayimport org.junit.Before;
3874956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKayimport org.junit.Test;
3974956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKayimport org.junit.runner.RunWith;
4074956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay
4174956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKayimport java.util.List;
4274956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay
4374956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay@RunWith(AndroidJUnit4.class)
4474956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay@SmallTest
4574956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKaypublic final class UserInputHandler_MouseTest {
4674956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay
4774956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay    private static final List<String> ITEMS = TestData.create(100);
4874956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay
492d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay    private UserInputHandler<TestEvent> mInputHandler;
506d20d190bc576bea1da48f79d868a5f383d3458bSteve McKay    private TestActionHandler mActionHandler;
5175b7b9039cf0efcb188e916c6f510328bfe099a8Ben Lin    private TestFocusHandler mFocusHandler;
522d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay    private SelectionProbe mSelection;
5375b7b9039cf0efcb188e916c6f510328bfe099a8Ben Lin    private SelectionManager mSelectionMgr;
5474956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay    private TestPredicate<DocumentDetails> mCanSelect;
55aa66c43df01033ccb957bfd1d513945676866f4cBen Lin    private TestEventHandler<InputEvent> mContextMenuClickHandler;
56990f76ea83a249cd8fc3c797e40626b94cd7945cSteve McKay    private TestEventHandler<InputEvent> mDragAndDropHandler;
57990f76ea83a249cd8fc3c797e40626b94cd7945cSteve McKay    private TestEventHandler<InputEvent> mGestureSelectHandler;
5811a2c1338f07cc0afd60e7ac6ea6ba505b80dadbBen Lin    private TestEventHandler<Void> mPerformHapticFeedback;
5974956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay
602d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay    private Builder mEvent;
6174956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay
6274956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay    @Before
6374956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay    public void setUp() {
6474956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay
6575b7b9039cf0efcb188e916c6f510328bfe099a8Ben Lin        mSelectionMgr = SelectionManagers.createTestInstance(ITEMS);
666d20d190bc576bea1da48f79d868a5f383d3458bSteve McKay        mActionHandler = new TestActionHandler();
672d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay
6875b7b9039cf0efcb188e916c6f510328bfe099a8Ben Lin        mSelection = new SelectionProbe(mSelectionMgr);
6974956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay        mCanSelect = new TestPredicate<>();
70aa66c43df01033ccb957bfd1d513945676866f4cBen Lin        mContextMenuClickHandler = new TestEventHandler<>();
71990f76ea83a249cd8fc3c797e40626b94cd7945cSteve McKay        mDragAndDropHandler = new TestEventHandler<>();
72990f76ea83a249cd8fc3c797e40626b94cd7945cSteve McKay        mGestureSelectHandler = new TestEventHandler<>();
7375b7b9039cf0efcb188e916c6f510328bfe099a8Ben Lin        mFocusHandler = new TestFocusHandler();
7474956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay
752d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay        mInputHandler = new UserInputHandler<>(
766d20d190bc576bea1da48f79d868a5f383d3458bSteve McKay                mActionHandler,
7775b7b9039cf0efcb188e916c6f510328bfe099a8Ben Lin                mFocusHandler,
7875b7b9039cf0efcb188e916c6f510328bfe099a8Ben Lin                mSelectionMgr,
7974956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay                (MotionEvent event) -> {
802d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay                    throw new UnsupportedOperationException("Not exercised in tests.");
8174956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay                },
8274956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay                mCanSelect,
83aa66c43df01033ccb957bfd1d513945676866f4cBen Lin                mContextMenuClickHandler::accept,
84990f76ea83a249cd8fc3c797e40626b94cd7945cSteve McKay                mDragAndDropHandler::accept,
8511a2c1338f07cc0afd60e7ac6ea6ba505b80dadbBen Lin                mGestureSelectHandler::accept,
8611a2c1338f07cc0afd60e7ac6ea6ba505b80dadbBen Lin                () -> mPerformHapticFeedback.accept(null));
8774956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay
88ed895580275101312d7d6fa6ebf78b79b4905a1eJon Mann        mEvent = TestEvent.builder().mouse().overDocIcon();
8974956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay    }
9074956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay
9174956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay    @Test
9274956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay    public void testConfirmedClick_StartsSelection() {
932d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay        mInputHandler.onSingleTapConfirmed(mEvent.at(11).build());
942d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay        mSelection.assertSelection(11);
9574956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay    }
9674956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay
9774956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay    @Test
98ed895580275101312d7d6fa6ebf78b79b4905a1eJon Mann    public void testClickOnIconWithExistingSelection_AddsToSelection() {
99ed895580275101312d7d6fa6ebf78b79b4905a1eJon Mann        mInputHandler.onSingleTapConfirmed(mEvent.at(11).build());
100ed895580275101312d7d6fa6ebf78b79b4905a1eJon Mann        mInputHandler.onSingleTapUp(mEvent.at(10).build());
101ed895580275101312d7d6fa6ebf78b79b4905a1eJon Mann        mSelection.assertSelected(10, 11);
102ed895580275101312d7d6fa6ebf78b79b4905a1eJon Mann    }
103ed895580275101312d7d6fa6ebf78b79b4905a1eJon Mann
104ed895580275101312d7d6fa6ebf78b79b4905a1eJon Mann    @Test
105ed895580275101312d7d6fa6ebf78b79b4905a1eJon Mann    public void testClickOnIconOfSelectedItem_RemovesFromSelection() {
106ed895580275101312d7d6fa6ebf78b79b4905a1eJon Mann        mInputHandler.onSingleTapConfirmed(mEvent.at(8).build());
107ed895580275101312d7d6fa6ebf78b79b4905a1eJon Mann        mInputHandler.onSingleTapUp(mEvent.at(11).shift().build());
108ed895580275101312d7d6fa6ebf78b79b4905a1eJon Mann        mSelection.assertSelected(8, 9, 10, 11);
109ed895580275101312d7d6fa6ebf78b79b4905a1eJon Mann
110ed895580275101312d7d6fa6ebf78b79b4905a1eJon Mann        mInputHandler.onSingleTapUp(mEvent.at(9).unshift().build());
111ed895580275101312d7d6fa6ebf78b79b4905a1eJon Mann        mSelection.assertSelected(8, 10, 11);
112ed895580275101312d7d6fa6ebf78b79b4905a1eJon Mann    }
113ed895580275101312d7d6fa6ebf78b79b4905a1eJon Mann
114ed895580275101312d7d6fa6ebf78b79b4905a1eJon Mann    @Test
115dbcccd65dab76420084315b962855bf9fc66108dBen Lin    public void testRightClickDown_StartsContextMenu() {
116dbcccd65dab76420084315b962855bf9fc66108dBen Lin        mInputHandler.onDown(mEvent.secondary().build());
117aa66c43df01033ccb957bfd1d513945676866f4cBen Lin        mContextMenuClickHandler.assertLastArgument(mEvent.secondary().build());
118aa66c43df01033ccb957bfd1d513945676866f4cBen Lin    }
119aa66c43df01033ccb957bfd1d513945676866f4cBen Lin
120aa66c43df01033ccb957bfd1d513945676866f4cBen Lin    @Test
121aa66c43df01033ccb957bfd1d513945676866f4cBen Lin    public void testAltClickDown_StartsContextMenu() {
122aa66c43df01033ccb957bfd1d513945676866f4cBen Lin        mInputHandler.onDown(mEvent.primary().alt().build());
123aa66c43df01033ccb957bfd1d513945676866f4cBen Lin        mContextMenuClickHandler.assertLastArgument(mEvent.primary().alt().build());
124dbcccd65dab76420084315b962855bf9fc66108dBen Lin    }
125dbcccd65dab76420084315b962855bf9fc66108dBen Lin
126dbcccd65dab76420084315b962855bf9fc66108dBen Lin    @Test
12735f99e02f3fa8af21139be216fc57c123779808dBen Lin    public void testScroll_shouldTrap() {
128f88bc0b6f1945db1eb11afcfb15bc2c08b13ba9fBen Lin        assertTrue(mInputHandler.onScroll(mEvent.at(0).action(MotionEvent.ACTION_MOVE).primary().build()));
129f88bc0b6f1945db1eb11afcfb15bc2c08b13ba9fBen Lin    }
130f88bc0b6f1945db1eb11afcfb15bc2c08b13ba9fBen Lin
131f88bc0b6f1945db1eb11afcfb15bc2c08b13ba9fBen Lin    @Test
132f88bc0b6f1945db1eb11afcfb15bc2c08b13ba9fBen Lin    public void testScroll_NoTrapForTwoFinger() {
133f88bc0b6f1945db1eb11afcfb15bc2c08b13ba9fBen Lin        assertFalse(mInputHandler.onScroll(mEvent.at(0).action(MotionEvent.ACTION_MOVE).build()));
13435f99e02f3fa8af21139be216fc57c123779808dBen Lin    }
13535f99e02f3fa8af21139be216fc57c123779808dBen Lin
13635f99e02f3fa8af21139be216fc57c123779808dBen Lin    @Test
13764ac117a2d42bc44cd1d742c82fbdc3afa04f762Ben Lin    public void testUnconfirmedCtrlClick_AddsToExistingSelection() {
13864ac117a2d42bc44cd1d742c82fbdc3afa04f762Ben Lin        mInputHandler.onSingleTapConfirmed(mEvent.at(7).build());
13964ac117a2d42bc44cd1d742c82fbdc3afa04f762Ben Lin
14064ac117a2d42bc44cd1d742c82fbdc3afa04f762Ben Lin        mInputHandler.onSingleTapUp(mEvent.at(11).ctrl().build());
1412d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay        mSelection.assertSelection(7, 11);
14274956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay    }
14374956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay
1442d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay    @Test
14564ac117a2d42bc44cd1d742c82fbdc3afa04f762Ben Lin    public void testUnconfirmedShiftClick_ExtendsSelection() {
14664ac117a2d42bc44cd1d742c82fbdc3afa04f762Ben Lin        mInputHandler.onSingleTapConfirmed(mEvent.at(7).build());
14764ac117a2d42bc44cd1d742c82fbdc3afa04f762Ben Lin
14864ac117a2d42bc44cd1d742c82fbdc3afa04f762Ben Lin        mInputHandler.onSingleTapUp(mEvent.at(11).shift().build());
14964ac117a2d42bc44cd1d742c82fbdc3afa04f762Ben Lin        mSelection.assertSelection(7, 8, 9, 10, 11);
15064ac117a2d42bc44cd1d742c82fbdc3afa04f762Ben Lin    }
15164ac117a2d42bc44cd1d742c82fbdc3afa04f762Ben Lin
15264ac117a2d42bc44cd1d742c82fbdc3afa04f762Ben Lin    @Test
15375b7b9039cf0efcb188e916c6f510328bfe099a8Ben Lin    public void testConfirmedShiftClick_ExtendsSelectionFromOriginFocus() {
15475b7b9039cf0efcb188e916c6f510328bfe099a8Ben Lin        mFocusHandler.focusPos = 7;
15575b7b9039cf0efcb188e916c6f510328bfe099a8Ben Lin        mFocusHandler.focusModelId = "7";
15675b7b9039cf0efcb188e916c6f510328bfe099a8Ben Lin        // This is a hack-y test, since the real FocusManager would've set range begin itself.
15775b7b9039cf0efcb188e916c6f510328bfe099a8Ben Lin        mSelectionMgr.setSelectionRangeBegin(7);
15875b7b9039cf0efcb188e916c6f510328bfe099a8Ben Lin        mSelection.assertNoSelection();
15975b7b9039cf0efcb188e916c6f510328bfe099a8Ben Lin
16075b7b9039cf0efcb188e916c6f510328bfe099a8Ben Lin        mInputHandler.onSingleTapConfirmed(mEvent.at(11).shift().build());
16175b7b9039cf0efcb188e916c6f510328bfe099a8Ben Lin        mSelection.assertSelection(7, 8, 9, 10, 11);
16275b7b9039cf0efcb188e916c6f510328bfe099a8Ben Lin    }
16375b7b9039cf0efcb188e916c6f510328bfe099a8Ben Lin
16475b7b9039cf0efcb188e916c6f510328bfe099a8Ben Lin    @Test
16564ac117a2d42bc44cd1d742c82fbdc3afa04f762Ben Lin    public void testUnconfirmedShiftClick_RotatesAroundOrigin() {
16664ac117a2d42bc44cd1d742c82fbdc3afa04f762Ben Lin        mInputHandler.onSingleTapConfirmed(mEvent.at(7).build());
16764ac117a2d42bc44cd1d742c82fbdc3afa04f762Ben Lin
16864ac117a2d42bc44cd1d742c82fbdc3afa04f762Ben Lin        mInputHandler.onSingleTapUp(mEvent.at(11).shift().build());
16964ac117a2d42bc44cd1d742c82fbdc3afa04f762Ben Lin        mSelection.assertSelection(7, 8, 9, 10, 11);
17064ac117a2d42bc44cd1d742c82fbdc3afa04f762Ben Lin
17164ac117a2d42bc44cd1d742c82fbdc3afa04f762Ben Lin        mInputHandler.onSingleTapUp(mEvent.at(5).shift().build());
17264ac117a2d42bc44cd1d742c82fbdc3afa04f762Ben Lin        mSelection.assertSelection(5, 6, 7);
17364ac117a2d42bc44cd1d742c82fbdc3afa04f762Ben Lin        mSelection.assertNotSelected(8, 9, 10, 11);
17464ac117a2d42bc44cd1d742c82fbdc3afa04f762Ben Lin    }
17564ac117a2d42bc44cd1d742c82fbdc3afa04f762Ben Lin
17664ac117a2d42bc44cd1d742c82fbdc3afa04f762Ben Lin    @Test
17764ac117a2d42bc44cd1d742c82fbdc3afa04f762Ben Lin    public void testUnconfirmedShiftCtrlClick_Combination() {
17864ac117a2d42bc44cd1d742c82fbdc3afa04f762Ben Lin        mInputHandler.onSingleTapConfirmed(mEvent.at(7).build());
17964ac117a2d42bc44cd1d742c82fbdc3afa04f762Ben Lin
18064ac117a2d42bc44cd1d742c82fbdc3afa04f762Ben Lin        mInputHandler.onSingleTapUp(mEvent.at(11).shift().build());
18164ac117a2d42bc44cd1d742c82fbdc3afa04f762Ben Lin        mSelection.assertSelection(7, 8, 9, 10, 11);
18264ac117a2d42bc44cd1d742c82fbdc3afa04f762Ben Lin
18364ac117a2d42bc44cd1d742c82fbdc3afa04f762Ben Lin        mInputHandler.onSingleTapUp(mEvent.at(5).unshift().ctrl().build());
18464ac117a2d42bc44cd1d742c82fbdc3afa04f762Ben Lin
18564ac117a2d42bc44cd1d742c82fbdc3afa04f762Ben Lin        mSelection.assertSelection(5, 7, 8, 9, 10, 11);
18664ac117a2d42bc44cd1d742c82fbdc3afa04f762Ben Lin    }
18764ac117a2d42bc44cd1d742c82fbdc3afa04f762Ben Lin
18864ac117a2d42bc44cd1d742c82fbdc3afa04f762Ben Lin    @Test
18964ac117a2d42bc44cd1d742c82fbdc3afa04f762Ben Lin    public void testUnconfirmedShiftCtrlClick_ShiftTakesPriority() {
19064ac117a2d42bc44cd1d742c82fbdc3afa04f762Ben Lin        mInputHandler.onSingleTapConfirmed(mEvent.at(7).build());
19164ac117a2d42bc44cd1d742c82fbdc3afa04f762Ben Lin
19264ac117a2d42bc44cd1d742c82fbdc3afa04f762Ben Lin        mInputHandler.onSingleTapUp(mEvent.at(11).ctrl().shift().build());
19364ac117a2d42bc44cd1d742c82fbdc3afa04f762Ben Lin        mSelection.assertSelection(7, 8, 9, 10, 11);
19464ac117a2d42bc44cd1d742c82fbdc3afa04f762Ben Lin    }
19564ac117a2d42bc44cd1d742c82fbdc3afa04f762Ben Lin
19617b761eb2f837d3ac079c07fc33877d6049c3cbaSteve McKay    // TODO: Add testSpaceBar_Previews, but we need to set a system property
19717b761eb2f837d3ac079c07fc33877d6049c3cbaSteve McKay    // to have a deterministic state.
19817b761eb2f837d3ac079c07fc33877d6049c3cbaSteve McKay
19964ac117a2d42bc44cd1d742c82fbdc3afa04f762Ben Lin    @Test
200d22cc1852ed3e028a37d713e41c57286d2e4c9f2Tomasz Mikolajewski    public void testDoubleClick_Opens() {
2012d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay        mInputHandler.onDoubleTap(mEvent.at(11).build());
202d22cc1852ed3e028a37d713e41c57286d2e4c9f2Tomasz Mikolajewski        mActionHandler.open.assertLastArgument(mEvent.build().getDocumentDetails());
20374956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay    }
20474956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay
2052d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay    @Test
206aa66c43df01033ccb957bfd1d513945676866f4cBen Lin    public void testMiddleClick_DoesNothing() {
207aa66c43df01033ccb957bfd1d513945676866f4cBen Lin        mInputHandler.onSingleTapConfirmed(mEvent.at(11).tertiary().build());
208aa66c43df01033ccb957bfd1d513945676866f4cBen Lin        mSelection.assertNoSelection();
209aa66c43df01033ccb957bfd1d513945676866f4cBen Lin    }
210aa66c43df01033ccb957bfd1d513945676866f4cBen Lin
211aa66c43df01033ccb957bfd1d513945676866f4cBen Lin    @Test
2122d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay    public void testClickOff_ClearsSelection() {
2132d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay        mInputHandler.onSingleTapConfirmed(mEvent.at(11).build());
2142d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay        mInputHandler.onSingleTapUp(mEvent.at(RecyclerView.NO_POSITION).build());
2152d1e4a3bb8bd58d2f0c92cbedeafe4ab8b71448eSteve McKay        mSelection.assertNoSelection();
21674956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay    }
217ed895580275101312d7d6fa6ebf78b79b4905a1eJon Mann
218ed895580275101312d7d6fa6ebf78b79b4905a1eJon Mann    @Test
219ed895580275101312d7d6fa6ebf78b79b4905a1eJon Mann    public void testClick_Focuses() {
220ed895580275101312d7d6fa6ebf78b79b4905a1eJon Mann        int id = 11;
221ed895580275101312d7d6fa6ebf78b79b4905a1eJon Mann        mInputHandler.onSingleTapConfirmed(mEvent.at(id).notOverDocIcon().build());
222ed895580275101312d7d6fa6ebf78b79b4905a1eJon Mann        assertTrue(mFocusHandler.getFocusModelId().equals(Integer.toString(id)));
223ed895580275101312d7d6fa6ebf78b79b4905a1eJon Mann    }
224ed895580275101312d7d6fa6ebf78b79b4905a1eJon Mann
225ed895580275101312d7d6fa6ebf78b79b4905a1eJon Mann    @Test
226ed895580275101312d7d6fa6ebf78b79b4905a1eJon Mann    public void testClickOff_ClearsFocus() {
227ed895580275101312d7d6fa6ebf78b79b4905a1eJon Mann        int id = 11;
228ed895580275101312d7d6fa6ebf78b79b4905a1eJon Mann        mInputHandler.onSingleTapConfirmed(mEvent.at(id).notOverDocIcon().build());
229ed895580275101312d7d6fa6ebf78b79b4905a1eJon Mann        assertTrue(mFocusHandler.hasFocusedItem());
230ed895580275101312d7d6fa6ebf78b79b4905a1eJon Mann        mInputHandler.onSingleTapUp(mEvent.at(RecyclerView.NO_POSITION).build());
231ed895580275101312d7d6fa6ebf78b79b4905a1eJon Mann        assertFalse(mFocusHandler.hasFocusedItem());
232ed895580275101312d7d6fa6ebf78b79b4905a1eJon Mann    }
233ed895580275101312d7d6fa6ebf78b79b4905a1eJon Mann
234ed895580275101312d7d6fa6ebf78b79b4905a1eJon Mann    @Test
235ed895580275101312d7d6fa6ebf78b79b4905a1eJon Mann    public void testClickOffSelection_RemovesSelectionAndFocuses() {
236ed895580275101312d7d6fa6ebf78b79b4905a1eJon Mann        mInputHandler.onSingleTapConfirmed(mEvent.at(1).build());
237ed895580275101312d7d6fa6ebf78b79b4905a1eJon Mann        mInputHandler.onSingleTapUp(mEvent.at(5).shift().build());
238ed895580275101312d7d6fa6ebf78b79b4905a1eJon Mann        mSelection.assertSelection(1, 2, 3, 4, 5);
239ed895580275101312d7d6fa6ebf78b79b4905a1eJon Mann
240ed895580275101312d7d6fa6ebf78b79b4905a1eJon Mann        int id = 11;
241ed895580275101312d7d6fa6ebf78b79b4905a1eJon Mann        mInputHandler.onSingleTapUp(mEvent.at(id).unshift().notOverDocIcon().build());
242ed895580275101312d7d6fa6ebf78b79b4905a1eJon Mann        assertTrue(mFocusHandler.getFocusModelId().equals(Integer.toString(id)));
243ed895580275101312d7d6fa6ebf78b79b4905a1eJon Mann        mSelection.assertNoSelection();
244ed895580275101312d7d6fa6ebf78b79b4905a1eJon Mann    }
24574956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay}
246