141d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin/*
241d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin * Copyright (C) 2016 The Android Open Source Project
341d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin *
441d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin * Licensed under the Apache License, Version 2.0 (the "License");
541d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin * you may not use this file except in compliance with the License.
641d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin * You may obtain a copy of the License at
741d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin *
841d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin *      http://www.apache.org/licenses/LICENSE-2.0
941d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin *
1041d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin * Unless required by applicable law or agreed to in writing, software
1141d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin * distributed under the License is distributed on an "AS IS" BASIS,
1241d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1341d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin * See the License for the specific language governing permissions and
1441d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin * limitations under the License.
1541d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin */
1641d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin
1741d7e22b9539e651a69e5f505eca1fff096155c6Ben Linpackage com.android.documentsui.dirlist;
1841d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin
1941d7e22b9539e651a69e5f505eca1fff096155c6Ben Linimport android.support.test.filters.SmallTest;
2041d7e22b9539e651a69e5f505eca1fff096155c6Ben Linimport android.support.test.runner.AndroidJUnit4;
2141d7e22b9539e651a69e5f505eca1fff096155c6Ben Linimport android.view.KeyEvent;
2241d7e22b9539e651a69e5f505eca1fff096155c6Ben Linimport android.view.MotionEvent;
2341d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin
2441d7e22b9539e651a69e5f505eca1fff096155c6Ben Linimport com.android.documentsui.base.Events.InputEvent;
254f78ba643270b9d84da1952d8e408220b25ec6fdSteve McKayimport com.android.documentsui.selection.SelectionManager;
26bd9f05aa36bf19d8b34d0d73a59e9bd65d3d26ebSteve McKayimport com.android.documentsui.selection.SelectionProbe;
275b0a2c187a9e446b683687817d22cbe443585223Steve McKayimport com.android.documentsui.testing.SelectionManagers;
2841d7e22b9539e651a69e5f505eca1fff096155c6Ben Linimport com.android.documentsui.testing.TestActionHandler;
2941d7e22b9539e651a69e5f505eca1fff096155c6Ben Linimport com.android.documentsui.testing.TestEvent;
30bd9f05aa36bf19d8b34d0d73a59e9bd65d3d26ebSteve McKayimport com.android.documentsui.testing.TestEvent.Builder;
3141d7e22b9539e651a69e5f505eca1fff096155c6Ben Linimport com.android.documentsui.testing.TestEventHandler;
3241d7e22b9539e651a69e5f505eca1fff096155c6Ben Linimport com.android.documentsui.testing.TestPredicate;
3341d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin
3441d7e22b9539e651a69e5f505eca1fff096155c6Ben Linimport org.junit.Before;
3541d7e22b9539e651a69e5f505eca1fff096155c6Ben Linimport org.junit.Test;
3641d7e22b9539e651a69e5f505eca1fff096155c6Ben Linimport org.junit.runner.RunWith;
3741d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin
3841d7e22b9539e651a69e5f505eca1fff096155c6Ben Linimport java.util.List;
3941d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin
4041d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin@RunWith(AndroidJUnit4.class)
4141d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin@SmallTest
4241d7e22b9539e651a69e5f505eca1fff096155c6Ben Linpublic final class UserInputHandler_KeyboardTest {
4341d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin
4441d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin    private static final List<String> ITEMS = TestData.create(100);
4541d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin
4641d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin    private UserInputHandler<TestEvent> mInputHandler;
4741d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin    private TestActionHandler mActionHandler;
4841d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin    private TestFocusHandler mFocusHandler;
4941d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin    private SelectionProbe mSelection;
5041d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin
5141d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin    private TestPredicate<DocumentDetails> mCanSelect;
5241d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin    private TestEventHandler<InputEvent> mRightClickHandler;
5341d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin    private TestEventHandler<InputEvent> mDragAndDropHandler;
5441d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin    private TestEventHandler<InputEvent> mGestureSelectHandler;
5511a2c1338f07cc0afd60e7ac6ea6ba505b80dadbBen Lin    private TestEventHandler<Void> mPerformHapticFeedback;
5641d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin
5741d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin    private Builder mEvent;
5841d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin
5941d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin    @Before
6041d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin    public void setUp() {
615b0a2c187a9e446b683687817d22cbe443585223Steve McKay        SelectionManager selectionMgr = SelectionManagers.createTestInstance(ITEMS);
6241d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin
6341d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin        mActionHandler = new TestActionHandler();
6441d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin        mSelection = new SelectionProbe(selectionMgr);
6541d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin        mFocusHandler = new TestFocusHandler();
6641d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin        mCanSelect = new TestPredicate<>();
6741d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin        mRightClickHandler = new TestEventHandler<>();
6841d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin        mDragAndDropHandler = new TestEventHandler<>();
6941d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin        mGestureSelectHandler = new TestEventHandler<>();
7041d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin
7141d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin        mInputHandler = new UserInputHandler<>(
7241d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin                mActionHandler,
7341d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin                mFocusHandler,
7441d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin                selectionMgr,
7541d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin                (MotionEvent event) -> {
7641d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin                    throw new UnsupportedOperationException("Not exercised in tests.");
7741d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin                },
7841d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin                mCanSelect,
7941d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin                mRightClickHandler::accept,
8041d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin                mDragAndDropHandler::accept,
8111a2c1338f07cc0afd60e7ac6ea6ba505b80dadbBen Lin                mGestureSelectHandler::accept,
8211a2c1338f07cc0afd60e7ac6ea6ba505b80dadbBen Lin                () -> mPerformHapticFeedback.accept(null));
8341d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin
84ed895580275101312d7d6fa6ebf78b79b4905a1eJon Mann        mEvent = TestEvent.builder().mouse().overDocIcon();
8541d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin    }
8641d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin
8741d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin    @Test
8841d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin    public void testArrowKey_nonShiftClearsSelection() {
8941d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin        mInputHandler.onSingleTapConfirmed(mEvent.at(11).build());
9041d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin        mSelection.assertSelection(11);
9141d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin
9241d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin        mFocusHandler.handleKey = true;
9341d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin        KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_UP);
9441d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin        mInputHandler.onKey(null, event.getKeyCode(), event);
9541d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin
9641d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin        mSelection.assertNoSelection();
9741d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin    }
9841d7e22b9539e651a69e5f505eca1fff096155c6Ben Lin}