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