163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay/*
263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay * Copyright 2017 The Android Open Source Project
363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay *
463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay * Licensed under the Apache License, Version 2.0 (the "License");
563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay * you may not use this file except in compliance with the License.
663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay * You may obtain a copy of the License at
763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay *
863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay *      http://www.apache.org/licenses/LICENSE-2.0
963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay *
1063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay * Unless required by applicable law or agreed to in writing, software
1163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay * distributed under the License is distributed on an "AS IS" BASIS,
1263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay * See the License for the specific language governing permissions and
1463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay * limitations under the License.
1563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay */
1663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
172a32c7e1264b14a20ed900abadea828b804a46ceAurimas Liutikaspackage androidx.recyclerview.selection;
1863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
192a32c7e1264b14a20ed900abadea828b804a46ceAurimas Liutikasimport static androidx.recyclerview.selection.testing.TestEvents.Mouse.ALT_CLICK;
202a32c7e1264b14a20ed900abadea828b804a46ceAurimas Liutikasimport static androidx.recyclerview.selection.testing.TestEvents.Mouse.CLICK;
212a32c7e1264b14a20ed900abadea828b804a46ceAurimas Liutikasimport static androidx.recyclerview.selection.testing.TestEvents.Mouse.CTRL_CLICK;
222a32c7e1264b14a20ed900abadea828b804a46ceAurimas Liutikasimport static androidx.recyclerview.selection.testing.TestEvents.Mouse.SECONDARY_CLICK;
232a32c7e1264b14a20ed900abadea828b804a46ceAurimas Liutikasimport static androidx.recyclerview.selection.testing.TestEvents.Mouse.SHIFT_CLICK;
242a32c7e1264b14a20ed900abadea828b804a46ceAurimas Liutikasimport static androidx.recyclerview.selection.testing.TestEvents.Mouse.TERTIARY_CLICK;
2563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
2660dadaeed4f5cee272b575dfde6c02e3506a2fa0Aurimas Liutikasimport static org.junit.Assert.assertFalse;
2760dadaeed4f5cee272b575dfde6c02e3506a2fa0Aurimas Liutikasimport static org.junit.Assert.assertTrue;
2860dadaeed4f5cee272b575dfde6c02e3506a2fa0Aurimas Liutikas
2963d2846409d84487d4856d3b8d18cc4684352e29Steve McKayimport android.support.test.filters.SmallTest;
3063d2846409d84487d4856d3b8d18cc4684352e29Steve McKayimport android.support.test.runner.AndroidJUnit4;
3163d2846409d84487d4856d3b8d18cc4684352e29Steve McKayimport android.view.MotionEvent;
3263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
332a32c7e1264b14a20ed900abadea828b804a46ceAurimas Liutikasimport androidx.recyclerview.selection.testing.SelectionProbe;
342a32c7e1264b14a20ed900abadea828b804a46ceAurimas Liutikasimport androidx.recyclerview.selection.testing.SelectionTrackers;
352a32c7e1264b14a20ed900abadea828b804a46ceAurimas Liutikasimport androidx.recyclerview.selection.testing.TestAdapter;
362a32c7e1264b14a20ed900abadea828b804a46ceAurimas Liutikasimport androidx.recyclerview.selection.testing.TestData;
372a32c7e1264b14a20ed900abadea828b804a46ceAurimas Liutikasimport androidx.recyclerview.selection.testing.TestEvents;
382a32c7e1264b14a20ed900abadea828b804a46ceAurimas Liutikasimport androidx.recyclerview.selection.testing.TestFocusDelegate;
392a32c7e1264b14a20ed900abadea828b804a46ceAurimas Liutikasimport androidx.recyclerview.selection.testing.TestItemDetails;
402a32c7e1264b14a20ed900abadea828b804a46ceAurimas Liutikasimport androidx.recyclerview.selection.testing.TestItemDetailsLookup;
412a32c7e1264b14a20ed900abadea828b804a46ceAurimas Liutikasimport androidx.recyclerview.selection.testing.TestItemKeyProvider;
422a32c7e1264b14a20ed900abadea828b804a46ceAurimas Liutikasimport androidx.recyclerview.selection.testing.TestOnContextClickListener;
432a32c7e1264b14a20ed900abadea828b804a46ceAurimas Liutikasimport androidx.recyclerview.selection.testing.TestOnItemActivatedListener;
4460dadaeed4f5cee272b575dfde6c02e3506a2fa0Aurimas Liutikasimport androidx.recyclerview.widget.RecyclerView;
4560dadaeed4f5cee272b575dfde6c02e3506a2fa0Aurimas Liutikas
4660dadaeed4f5cee272b575dfde6c02e3506a2fa0Aurimas Liutikasimport org.junit.Before;
4760dadaeed4f5cee272b575dfde6c02e3506a2fa0Aurimas Liutikasimport org.junit.Test;
4860dadaeed4f5cee272b575dfde6c02e3506a2fa0Aurimas Liutikasimport org.junit.runner.RunWith;
4963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
5063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay@RunWith(AndroidJUnit4.class)
5163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay@SmallTest
5263d2846409d84487d4856d3b8d18cc4684352e29Steve McKaypublic final class MouseInputHandlerTest {
5363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
5463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    private MouseInputHandler mInputDelegate;
5563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
567fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay    private TestOnContextClickListener mMouseCallbacks;
577fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay    private TestOnItemActivatedListener mActivationCallbacks;
587fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay    private TestFocusDelegate mFocusCallbacks;
5963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
6063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    private TestItemDetailsLookup mDetailsLookup;
6163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    private SelectionProbe mSelection;
627fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay    private SelectionTracker mSelectionMgr;
6363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
6463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    private TestEvents.Builder mEvent;
6563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
6663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    @Before
6763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    public void setUp() {
6863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
697fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay        mSelectionMgr = SelectionTrackers.createStringTracker("mouse-input-test", 100);
7063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mDetailsLookup = new TestItemDetailsLookup();
7163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mSelection = new SelectionProbe(mSelectionMgr);
7263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
737fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay        mMouseCallbacks = new TestOnContextClickListener();
747fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay        mActivationCallbacks = new TestOnItemActivatedListener();
757fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay        mFocusCallbacks = new TestFocusDelegate();
7663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
7763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mInputDelegate = new MouseInputHandler(
7863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay                mSelectionMgr,
797fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay                new TestItemKeyProvider(
807fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay                        ItemKeyProvider.SCOPE_MAPPED,
817fb763509e07f98d650efc25c91bff8b1cb239acSteve McKay                        new TestAdapter(TestData.createStringData(100))),
8263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay                mDetailsLookup,
8363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay                mMouseCallbacks,
8463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay                mActivationCallbacks,
8563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay                mFocusCallbacks);
8663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
8763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mEvent = TestEvents.builder().mouse();
8863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mDetailsLookup.initAt(RecyclerView.NO_POSITION);
8963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    }
9063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
9163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    @Test
9263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    public void testConfirmedClick_StartsSelection() {
9363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mDetailsLookup.initAt(11).setInItemSelectRegion(true);
9463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mInputDelegate.onSingleTapConfirmed(CLICK);
9563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
9663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mSelection.assertSelection(11);
9763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    }
9863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
9963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    @Test
10063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    public void testClickOnSelectRegion_AddsToSelection() {
10163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mDetailsLookup.initAt(11).setInItemSelectRegion(true);
10263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mInputDelegate.onSingleTapConfirmed(CLICK);
10363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
10463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mDetailsLookup.initAt(10).setInItemSelectRegion(true);
10563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mInputDelegate.onSingleTapUp(CLICK);
10663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
10763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mSelection.assertSelected(10, 11);
10863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    }
10963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
11063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    @Test
11163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    public void testClickOnIconOfSelectedItem_RemovesFromSelection() {
11263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mDetailsLookup.initAt(8).setInItemSelectRegion(true);
11363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mInputDelegate.onSingleTapConfirmed(CLICK);
11463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
11563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mDetailsLookup.initAt(11);
11663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mInputDelegate.onSingleTapUp(SHIFT_CLICK);
11763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mSelection.assertSelected(8, 9, 10, 11);
11863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
11963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mDetailsLookup.initAt(9);
12063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mInputDelegate.onSingleTapUp(CLICK);
12163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mSelection.assertSelected(8, 10, 11);
12263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    }
12363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
12463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    @Test
12563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    public void testRightClickDown_StartsContextMenu() {
12663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mInputDelegate.onDown(SECONDARY_CLICK);
12763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
12863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mMouseCallbacks.assertLastEvent(SECONDARY_CLICK);
12963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    }
13063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
13163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    @Test
13263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    public void testAltClickDown_StartsContextMenu() {
13363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mInputDelegate.onDown(ALT_CLICK);
13463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
13563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mMouseCallbacks.assertLastEvent(ALT_CLICK);
13663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    }
13763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
13863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    @Test
13963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    public void testScroll_shouldTrap() {
14063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mDetailsLookup.initAt(0);
14163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        assertTrue(mInputDelegate.onScroll(
14263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay                null,
14363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay                mEvent.action(MotionEvent.ACTION_MOVE).primary().build(),
14463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay                -1,
14563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay                -1));
14663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    }
14763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
14863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    @Test
14963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    public void testScroll_NoTrapForTwoFinger() {
15063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mDetailsLookup.initAt(0);
15163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        assertFalse(mInputDelegate.onScroll(
15263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay                null,
15363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay                mEvent.action(MotionEvent.ACTION_MOVE).build(),
15463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay                -1,
15563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay                -1));
15663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    }
15763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
15863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    @Test
15963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    public void testUnconfirmedCtrlClick_AddsToExistingSelection() {
16063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mDetailsLookup.initAt(7).setInItemSelectRegion(true);
16163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mInputDelegate.onSingleTapConfirmed(CLICK);
16263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
16363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mDetailsLookup.initAt(11);
16463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mInputDelegate.onSingleTapUp(CTRL_CLICK);
16563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
16663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mSelection.assertSelection(7, 11);
16763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    }
16863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
16963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    @Test
17063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    public void testUnconfirmedShiftClick_ExtendsSelection() {
17163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mDetailsLookup.initAt(7).setInItemSelectRegion(true);
17263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mInputDelegate.onSingleTapConfirmed(CLICK);
17363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
17463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mDetailsLookup.initAt(11);
17563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mInputDelegate.onSingleTapUp(SHIFT_CLICK);
17663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
17763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mSelection.assertSelection(7, 8, 9, 10, 11);
17863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    }
17963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
18063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    @Test
18163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    public void testConfirmedShiftClick_ExtendsSelectionFromFocus() {
18263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        TestItemDetails item = mDetailsLookup.initAt(7);
18363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mFocusCallbacks.focusItem(item);
18463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
18563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        // There should be no selected item at this point, just focus on "7".
18663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mDetailsLookup.initAt(11);
18763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mInputDelegate.onSingleTapConfirmed(SHIFT_CLICK);
18863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mSelection.assertSelection(7, 8, 9, 10, 11);
18963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    }
19063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
19163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    @Test
19263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    public void testUnconfirmedShiftClick_RotatesAroundOrigin() {
19363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mDetailsLookup.initAt(7).setInItemSelectRegion(true);
19463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mInputDelegate.onSingleTapConfirmed(CLICK);
19563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
19663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mDetailsLookup.initAt(11);
19763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mInputDelegate.onSingleTapUp(SHIFT_CLICK);
19863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mSelection.assertSelection(7, 8, 9, 10, 11);
19963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
20063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mDetailsLookup.initAt(5);
20163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mInputDelegate.onSingleTapUp(SHIFT_CLICK);
20263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
20363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mSelection.assertSelection(5, 6, 7);
20463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mSelection.assertNotSelected(8, 9, 10, 11);
20563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    }
20663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
20763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    @Test
20863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    public void testUnconfirmedShiftCtrlClick_Combination() {
20963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mDetailsLookup.initAt(7).setInItemSelectRegion(true);
21063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mInputDelegate.onSingleTapConfirmed(CLICK);
21163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
21263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mDetailsLookup.initAt(11);
21363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mInputDelegate.onSingleTapUp(SHIFT_CLICK);
21463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mSelection.assertSelection(7, 8, 9, 10, 11);
21563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
21663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mDetailsLookup.initAt(5);
21763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mInputDelegate.onSingleTapUp(CTRL_CLICK);
21863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
21963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mSelection.assertSelection(5, 7, 8, 9, 10, 11);
22063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    }
22163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
22263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    @Test
22363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    public void testUnconfirmedShiftCtrlClick_ShiftTakesPriority() {
22463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mDetailsLookup.initAt(7).setInItemSelectRegion(true);
22563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mInputDelegate.onSingleTapConfirmed(CLICK);
22663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
22763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mDetailsLookup.initAt(11);
22863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mInputDelegate.onSingleTapUp(mEvent.ctrl().shift().build());
22963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
23063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mSelection.assertSelection(7, 8, 9, 10, 11);
23163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    }
23263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
23363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    // TODO: Add testSpaceBar_Previews, but we need to set a system property
23463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    // to have a deterministic state.
23563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
23663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    @Test
23763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    public void testDoubleClick_Opens() {
23863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        TestItemDetails doc = mDetailsLookup.initAt(11);
23963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mInputDelegate.onDoubleTap(CLICK);
24063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
24163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mActivationCallbacks.assertActivated(doc);
24263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    }
24363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
24463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    @Test
24563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    public void testMiddleClick_DoesNothing() {
24663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mDetailsLookup.initAt(11).setInItemSelectRegion(true);
24763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mInputDelegate.onSingleTapConfirmed(TERTIARY_CLICK);
24863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
24963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mSelection.assertNoSelection();
25063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    }
25163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
25263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    @Test
25363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    public void testClickOff_ClearsSelection() {
25463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mDetailsLookup.initAt(11).setInItemSelectRegion(true);
25563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mInputDelegate.onSingleTapConfirmed(CLICK);
25663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
25763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mDetailsLookup.initAt(RecyclerView.NO_POSITION);
25863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mInputDelegate.onSingleTapUp(CLICK);
25963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
26063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mSelection.assertNoSelection();
26163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    }
26263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
26363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    @Test
26463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    public void testClick_Focuses() {
26563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mDetailsLookup.initAt(11).setInItemSelectRegion(false);
26663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mInputDelegate.onSingleTapConfirmed(CLICK);
26763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
26863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mFocusCallbacks.assertHasFocus(true);
26963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mFocusCallbacks.assertFocused("11");
27063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    }
27163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
27263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    @Test
27363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    public void testClickOff_ClearsFocus() {
27463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mDetailsLookup.initAt(11).setInItemSelectRegion(false);
27563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mInputDelegate.onSingleTapConfirmed(CLICK);
27663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mFocusCallbacks.assertHasFocus(true);
27763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
27863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mDetailsLookup.initAt(RecyclerView.NO_POSITION);
27963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mInputDelegate.onSingleTapUp(CLICK);
28063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mFocusCallbacks.assertHasFocus(false);
28163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    }
28263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
28363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    @Test
28463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    public void testClickOffSelection_RemovesSelectionAndFocuses() {
28563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mDetailsLookup.initAt(1).setInItemSelectRegion(true);
28663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mInputDelegate.onSingleTapConfirmed(CLICK);
28763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
28863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mDetailsLookup.initAt(5);
28963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mInputDelegate.onSingleTapUp(SHIFT_CLICK);
29063d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
29163d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mSelection.assertSelection(1, 2, 3, 4, 5);
29263d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
29363d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mDetailsLookup.initAt(11);
29463d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mInputDelegate.onSingleTapUp(CLICK);
29563d2846409d84487d4856d3b8d18cc4684352e29Steve McKay
29663d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mFocusCallbacks.assertFocused("11");
29763d2846409d84487d4856d3b8d18cc4684352e29Steve McKay        mSelection.assertNoSelection();
29863d2846409d84487d4856d3b8d18cc4684352e29Steve McKay    }
29963d2846409d84487d4856d3b8d18cc4684352e29Steve McKay}
300