10902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin/*
20902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin * Copyright (C) 2016 The Android Open Source Project
30902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin *
40902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin * Licensed under the Apache License, Version 2.0 (the "License");
50902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin * you may not use this file except in compliance with the License.
60902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin * You may obtain a copy of the License at
70902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin *
80902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin *      http://www.apache.org/licenses/LICENSE-2.0
90902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin *
100902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin * Unless required by applicable law or agreed to in writing, software
110902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin * distributed under the License is distributed on an "AS IS" BASIS,
120902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin * See the License for the specific language governing permissions and
140902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin * limitations under the License.
150902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin */
160902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin
170902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Linpackage com.android.documentsui;
180902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin
190902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Linimport static org.junit.Assert.assertEquals;
200902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Linimport static org.junit.Assert.assertFalse;
210902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Linimport static org.junit.Assert.assertTrue;
220902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin
230902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Linimport android.support.test.filters.SmallTest;
240902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Linimport android.support.test.runner.AndroidJUnit4;
250902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Linimport android.view.KeyEvent;
260902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Linimport android.view.MotionEvent;
270902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin
280902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Linimport com.android.documentsui.base.Procedure;
290902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Linimport com.android.documentsui.dirlist.TestFocusHandler;
300902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Linimport com.android.documentsui.selection.SelectionManager;
310902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Linimport com.android.documentsui.testing.SelectionManagers;
320902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Linimport com.android.documentsui.testing.TestFeatures;
330902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin
340902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Linimport org.junit.Before;
350902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Linimport org.junit.Test;
360902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Linimport org.junit.runner.RunWith;
370902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin
380902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin@RunWith(AndroidJUnit4.class)
390902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin@SmallTest
400902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Linpublic class SharedInputHandlerTest {
410902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin
420902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin    private SharedInputHandler mSharedInputHandler;
430902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin    private SelectionManager mSelectionMgr = SelectionManagers.createTestInstance();
440902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin    private TestFeatures mFeatures = new TestFeatures();
450902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin    private TestFocusHandler mFocusHandler = new TestFocusHandler();
460902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin    private boolean mDirPopHappened;
470902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin    private boolean mCanceledSearch;
480902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin    private Procedure mDirPopper = new Procedure() {
490902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        @Override
500902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        public boolean run() {
510902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin            mDirPopHappened = true;
520902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin            return true;
530902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        }
540902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin    };
550902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin
560902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin    @Before
570902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin    public void setUp() {
580902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        mDirPopHappened = false;
590902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        mSharedInputHandler = new SharedInputHandler(
600902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin                mFocusHandler,
610902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin                mSelectionMgr,
620902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin                () -> {
630902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin                    return false;
640902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin                },
650902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin                mDirPopper,
660902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin                mFeatures);
670902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin    }
680902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin
690902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin    @Test
700902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin    public void testUnrelatedButton_DoesNothing() {
710902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        KeyEvent event =
720902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin                new KeyEvent(0, 0, MotionEvent.ACTION_DOWN, KeyEvent.KEYCODE_A, 0, 0);
730902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        assertFalse(mSharedInputHandler.onKeyDown(event.getKeyCode(), event));
740902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin    }
750902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin
760902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin    @Test
770902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin    public void testBackButton_CancelsSearch() {
780902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        mSelectionMgr.toggleSelection("1");
790902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        mSharedInputHandler = new SharedInputHandler(
800902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin                new TestFocusHandler(),
810902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin                SelectionManagers.createTestInstance(),
820902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin                () -> {
830902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin                        mCanceledSearch = true;
840902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin                        return true;
850902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin                },
860902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin                mDirPopper,
870902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin                new TestFeatures());
880902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        KeyEvent backEvent =
890902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin                new KeyEvent(0, 0, MotionEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK, 0, 0);
900902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        assertTrue(mSharedInputHandler.onKeyDown(backEvent.getKeyCode(), backEvent));
910902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin
920902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        assertTrue(mCanceledSearch);
930902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        assertEquals(mSelectionMgr.getSelection().size(), 1);
940902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        assertFalse(mDirPopHappened);
950902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin    }
960902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin
970902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin    @Test
980902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin    public void testBackButton_ClearsSelection() {
990902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        mSelectionMgr.toggleSelection("1");
1000902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        assertEquals(mSelectionMgr.getSelection().size(), 1);
1010902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        KeyEvent backEvent =
1020902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin                new KeyEvent(0, 0, MotionEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK, 0, 0);
1030902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        assertTrue(mSharedInputHandler.onKeyDown(backEvent.getKeyCode(), backEvent));
1040902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin
1050902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        assertFalse(mCanceledSearch);
1060902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        assertEquals(mSelectionMgr.getSelection().size(), 0);
1070902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        assertFalse(mDirPopHappened);
1080902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin    }
1090902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin
1100902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin    @Test
1110902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin    public void testBackButton_PopsDirectory() {
1120902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        KeyEvent backEvent =
1130902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin                new KeyEvent(0, 0, MotionEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK, 0, 0);
1140902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        assertTrue(mSharedInputHandler.onKeyDown(backEvent.getKeyCode(), backEvent));
1150902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin
1160902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        assertFalse(mCanceledSearch);
1170902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        assertEquals(mSelectionMgr.getSelection().size(), 0);
1180902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        assertTrue(mDirPopHappened);
1190902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin    }
1200902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin
1210902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin    @Test
1220902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin    public void testEscButton_CancelsSearch() {
1230902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        mSelectionMgr.toggleSelection("1");
1240902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        mSharedInputHandler = new SharedInputHandler(
1250902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin                new TestFocusHandler(),
1260902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin                SelectionManagers.createTestInstance(),
1270902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin                () -> {
1280902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin                        mCanceledSearch = true;
1290902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin                        return true;
1300902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin                },
1310902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin                mDirPopper,
1320902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin                new TestFeatures());
1330902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        KeyEvent escapeEvent =
1340902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin                new KeyEvent(0, 0, MotionEvent.ACTION_DOWN, KeyEvent.KEYCODE_ESCAPE, 0, 0);
1350902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        assertTrue(mSharedInputHandler.onKeyDown(escapeEvent.getKeyCode(), escapeEvent));
1360902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin
1370902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        assertTrue(mCanceledSearch);
1380902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        assertEquals(mSelectionMgr.getSelection().size(), 1);
1390902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        assertFalse(mDirPopHappened);
1400902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin    }
1410902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin
1420902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin    @Test
1430902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin    public void testEscButton_ClearsSelection() {
1440902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        mSelectionMgr.toggleSelection("1");
1450902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        assertEquals(mSelectionMgr.getSelection().size(), 1);
1460902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        KeyEvent escapeEvent =
1470902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin                new KeyEvent(0, 0, MotionEvent.ACTION_DOWN, KeyEvent.KEYCODE_ESCAPE, 0, 0);
1480902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        assertTrue(mSharedInputHandler.onKeyDown(escapeEvent.getKeyCode(), escapeEvent));
1490902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin
1500902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        assertFalse(mCanceledSearch);
1510902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        assertEquals(mSelectionMgr.getSelection().size(), 0);
1520902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        assertFalse(mDirPopHappened);
1530902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin    }
1540902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin
1550902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin    @Test
1560902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin    public void testEscButton_DoesNotPopDirectory() {
1570902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        KeyEvent escapeEvent =
1580902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin                new KeyEvent(0, 0, MotionEvent.ACTION_DOWN, KeyEvent.KEYCODE_ESCAPE, 0, 0);
1590902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        assertTrue(mSharedInputHandler.onKeyDown(escapeEvent.getKeyCode(), escapeEvent));
1600902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin
1610902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        assertFalse(mCanceledSearch);
1620902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        assertEquals(mSelectionMgr.getSelection().size(), 0);
1630902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        assertFalse(mDirPopHappened);
1640902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin    }
1650902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin
1660902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin    @Test
1670902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin    public void testDeleteButton_PopsDirectory() {
1680902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        KeyEvent delEvent =
1690902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin                new KeyEvent(0, 0, MotionEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL, 0, 0);
1700902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        assertTrue(mSharedInputHandler.onKeyDown(delEvent.getKeyCode(), delEvent));
1710902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin
1720902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        assertTrue(mDirPopHappened);
1730902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin    }
1740902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin
1750902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin    @Test
1760902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin    public void testTab_AdvancesFocusArea() {
1770902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        mFeatures.systemKeyboardNavigation = false;
1780902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        KeyEvent tabEvent =
1790902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin                new KeyEvent(0, 0, MotionEvent.ACTION_DOWN, KeyEvent.KEYCODE_TAB, 0, 0);
1800902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        assertTrue(mSharedInputHandler.onKeyDown(tabEvent.getKeyCode(), tabEvent));
1810902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin
1820902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        assertTrue(mFocusHandler.advanceFocusAreaCalled);
1830902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin    }
1840902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin
1850902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin    @Test
1860902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin    public void testNavKey_FocusesDirectory() {
1870902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        mFeatures.systemKeyboardNavigation = false;
1880902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        KeyEvent navEvent =
1890902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin                new KeyEvent(0, 0, MotionEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_UP, 0, 0);
1900902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        assertTrue(mSharedInputHandler.onKeyDown(navEvent.getKeyCode(), navEvent));
1910902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin
1920902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin        assertTrue(mFocusHandler.focusDirectoryCalled);
1930902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin    }
1940902f07dec9cfb0bd5d7c9c6222b433b91bf2051Ben Lin}
195