| /* | |
| * Copyright (C) 2016 The Android Open Source Project | |
| * | |
| * Licensed under the Apache License, Version 2.0 (the "License"); | |
| * you may not use this file except in compliance with the License. | |
| * You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, software | |
| * distributed under the License is distributed on an "AS IS" BASIS, | |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| * See the License for the specific language governing permissions and | |
| * limitations under the License. | |
| */ | |
| package com.android.documentsui; | |
| import static org.junit.Assert.assertEquals; | |
| import static org.junit.Assert.assertFalse; | |
| import static org.junit.Assert.assertTrue; | |
| import android.view.KeyEvent; | |
| import android.view.MotionEvent; | |
| import androidx.recyclerview.selection.SelectionTracker; | |
| import androidx.test.filters.SmallTest; | |
| import androidx.test.runner.AndroidJUnit4; | |
| import com.android.documentsui.base.Procedure; | |
| import com.android.documentsui.dirlist.TestFocusHandler; | |
| import com.android.documentsui.testing.TestDrawerController; | |
| import com.android.documentsui.testing.TestFeatures; | |
| import org.junit.Before; | |
| import org.junit.Test; | |
| import org.junit.runner.RunWith; | |
| @RunWith(AndroidJUnit4.class) | |
| @SmallTest | |
| public class SharedInputHandlerTest { | |
| private SharedInputHandler mSharedInputHandler; | |
| private SelectionTracker<String> mSelectionMgr = SelectionHelpers.createTestInstance(); | |
| private TestFeatures mFeatures = new TestFeatures(); | |
| private TestFocusHandler mFocusHandler = new TestFocusHandler(); | |
| private TestDrawerController mDrawer = TestDrawerController.create(); | |
| private boolean mDirPopHappened; | |
| private boolean mCanceledSearch; | |
| private boolean mSearchExecuted; | |
| private Procedure mDirPopper = new Procedure() { | |
| @Override | |
| public boolean run() { | |
| mDirPopHappened = true; | |
| return true; | |
| } | |
| }; | |
| private Runnable mSearchExecutor = new Runnable() { | |
| @Override | |
| public void run() { | |
| mSearchExecuted = true; | |
| } | |
| }; | |
| @Before | |
| public void setUp() { | |
| mDirPopHappened = false; | |
| mSharedInputHandler = new SharedInputHandler( | |
| mFocusHandler, | |
| mSelectionMgr, | |
| () -> false, | |
| mDirPopper, | |
| mFeatures, | |
| mDrawer, | |
| mSearchExecutor); | |
| } | |
| @Test | |
| public void testUnrelatedButton_DoesNothing() { | |
| KeyEvent event = | |
| new KeyEvent(0, 0, MotionEvent.ACTION_DOWN, KeyEvent.KEYCODE_A, 0, 0); | |
| assertFalse(mSharedInputHandler.onKeyDown(event.getKeyCode(), event)); | |
| } | |
| @Test | |
| public void testBackButton_CancelsSearch() { | |
| mSelectionMgr.select("1"); | |
| mSharedInputHandler = new SharedInputHandler( | |
| new TestFocusHandler(), | |
| SelectionHelpers.createTestInstance(), | |
| () -> { | |
| mCanceledSearch = true; | |
| return true; | |
| }, | |
| mDirPopper, | |
| new TestFeatures(), | |
| mDrawer, | |
| mSearchExecutor); | |
| KeyEvent backEvent = | |
| new KeyEvent(0, 0, MotionEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK, 0, 0); | |
| assertTrue(mSharedInputHandler.onKeyDown(backEvent.getKeyCode(), backEvent)); | |
| assertTrue(mCanceledSearch); | |
| assertEquals(mSelectionMgr.getSelection().size(), 1); | |
| assertFalse(mDirPopHappened); | |
| mDrawer.assertWasClosed(); | |
| } | |
| @Test | |
| public void testBackButton_ClearsSelection() { | |
| mSelectionMgr.select("1"); | |
| assertEquals(mSelectionMgr.getSelection().size(), 1); | |
| KeyEvent backEvent = | |
| new KeyEvent(0, 0, MotionEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK, 0, 0); | |
| assertTrue(mSharedInputHandler.onKeyDown(backEvent.getKeyCode(), backEvent)); | |
| assertFalse(mCanceledSearch); | |
| assertEquals(mSelectionMgr.getSelection().size(), 0); | |
| assertFalse(mDirPopHappened); | |
| mDrawer.assertWasClosed(); | |
| } | |
| @Test | |
| public void testBackButton_PopsDirectory() { | |
| KeyEvent backEvent = | |
| new KeyEvent(0, 0, MotionEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK, 0, 0); | |
| assertTrue(mSharedInputHandler.onKeyDown(backEvent.getKeyCode(), backEvent)); | |
| assertFalse(mCanceledSearch); | |
| assertEquals(mSelectionMgr.getSelection().size(), 0); | |
| assertTrue(mDirPopHappened); | |
| mDrawer.assertWasClosed(); | |
| } | |
| @Test | |
| public void testBackButton_CloseDrawer() { | |
| KeyEvent backEvent = | |
| new KeyEvent(0, 0, MotionEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK, 0, 0); | |
| mDrawer.openDrawer(true); | |
| assertTrue(mSharedInputHandler.onKeyDown(backEvent.getKeyCode(), backEvent)); | |
| mDrawer.assertWasOpened(); | |
| } | |
| @Test | |
| public void testEscButton_CancelsSearch() { | |
| mSelectionMgr.select("1"); | |
| mSharedInputHandler = new SharedInputHandler( | |
| new TestFocusHandler(), | |
| SelectionHelpers.createTestInstance(), | |
| () -> { | |
| mCanceledSearch = true; | |
| return true; | |
| }, | |
| mDirPopper, | |
| new TestFeatures(), | |
| mDrawer, | |
| mSearchExecutor); | |
| KeyEvent escapeEvent = | |
| new KeyEvent(0, 0, MotionEvent.ACTION_DOWN, KeyEvent.KEYCODE_ESCAPE, 0, 0); | |
| assertTrue(mSharedInputHandler.onKeyDown(escapeEvent.getKeyCode(), escapeEvent)); | |
| assertTrue(mCanceledSearch); | |
| assertEquals(mSelectionMgr.getSelection().size(), 1); | |
| assertFalse(mDirPopHappened); | |
| } | |
| @Test | |
| public void testEscButton_ClearsSelection() { | |
| mSelectionMgr.select("1"); | |
| assertEquals(mSelectionMgr.getSelection().size(), 1); | |
| KeyEvent escapeEvent = | |
| new KeyEvent(0, 0, MotionEvent.ACTION_DOWN, KeyEvent.KEYCODE_ESCAPE, 0, 0); | |
| assertTrue(mSharedInputHandler.onKeyDown(escapeEvent.getKeyCode(), escapeEvent)); | |
| assertFalse(mCanceledSearch); | |
| assertEquals(mSelectionMgr.getSelection().size(), 0); | |
| assertFalse(mDirPopHappened); | |
| } | |
| @Test | |
| public void testEscButton_DoesNotPopDirectory() { | |
| KeyEvent escapeEvent = | |
| new KeyEvent(0, 0, MotionEvent.ACTION_DOWN, KeyEvent.KEYCODE_ESCAPE, 0, 0); | |
| assertTrue(mSharedInputHandler.onKeyDown(escapeEvent.getKeyCode(), escapeEvent)); | |
| assertFalse(mCanceledSearch); | |
| assertEquals(mSelectionMgr.getSelection().size(), 0); | |
| assertFalse(mDirPopHappened); | |
| } | |
| @Test | |
| public void testDeleteButton_PopsDirectory() { | |
| KeyEvent delEvent = | |
| new KeyEvent(0, 0, MotionEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL, 0, 0); | |
| assertTrue(mSharedInputHandler.onKeyDown(delEvent.getKeyCode(), delEvent)); | |
| assertTrue(mDirPopHappened); | |
| } | |
| @Test | |
| public void testTab_AdvancesFocusArea() { | |
| mFeatures.systemKeyboardNavigation = false; | |
| KeyEvent tabEvent = | |
| new KeyEvent(0, 0, MotionEvent.ACTION_DOWN, KeyEvent.KEYCODE_TAB, 0, 0); | |
| assertTrue(mSharedInputHandler.onKeyDown(tabEvent.getKeyCode(), tabEvent)); | |
| assertTrue(mFocusHandler.advanceFocusAreaCalled); | |
| } | |
| @Test | |
| public void testNavKey_FocusesDirectory() { | |
| mFeatures.systemKeyboardNavigation = false; | |
| KeyEvent navEvent = | |
| new KeyEvent(0, 0, MotionEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_UP, 0, 0); | |
| assertTrue(mSharedInputHandler.onKeyDown(navEvent.getKeyCode(), navEvent)); | |
| assertTrue(mFocusHandler.focusDirectoryCalled); | |
| } | |
| @Test | |
| public void testSearchKey_LaunchSearchView() { | |
| KeyEvent searchEvent = | |
| new KeyEvent(0, 0, MotionEvent.ACTION_DOWN, KeyEvent.KEYCODE_SEARCH, 0, 0); | |
| assertTrue(mSharedInputHandler.onKeyDown(searchEvent.getKeyCode(), searchEvent)); | |
| assertTrue(mSearchExecuted); | |
| } | |
| } |