Home | History | Annotate | Download | only in picker
      1 /*
      2  * Copyright (C) 2016 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.documentsui.picker;
     18 
     19 import static com.android.documentsui.base.State.ACTION_CREATE;
     20 import static com.android.documentsui.base.State.ACTION_OPEN;
     21 import static org.junit.Assert.assertFalse;
     22 import static org.junit.Assert.assertTrue;
     23 
     24 import android.provider.DocumentsContract.Root;
     25 import android.support.test.filters.SmallTest;
     26 import android.support.test.runner.AndroidJUnit4;
     27 
     28 import com.android.documentsui.R;
     29 import com.android.documentsui.base.DocumentInfo;
     30 import com.android.documentsui.base.RootInfo;
     31 import com.android.documentsui.base.State;
     32 import com.android.documentsui.testing.TestDirectoryDetails;
     33 import com.android.documentsui.testing.TestMenu;
     34 import com.android.documentsui.testing.TestMenuItem;
     35 import com.android.documentsui.testing.TestSearchViewManager;
     36 import com.android.documentsui.testing.TestSelectionDetails;
     37 
     38 import org.junit.Before;
     39 import org.junit.Test;
     40 import org.junit.runner.RunWith;
     41 
     42 @RunWith(AndroidJUnit4.class)
     43 @SmallTest
     44 public final class MenuManagerTest {
     45 
     46     private TestMenu testMenu;
     47 
     48     /* Directory Context Menu items */
     49     private TestMenuItem dirShare;
     50     private TestMenuItem dirOpen;
     51     private TestMenuItem dirOpenWith;
     52     private TestMenuItem dirCutToClipboard;
     53     private TestMenuItem dirCopyToClipboard;
     54     private TestMenuItem dirPasteFromClipboard;
     55     private TestMenuItem dirCreateDir;
     56     private TestMenuItem dirSelectAll;
     57     private TestMenuItem dirRename;
     58     private TestMenuItem dirDelete;
     59     private TestMenuItem dirViewInOwner;
     60     private TestMenuItem dirOpenInNewWindow;
     61     private TestMenuItem dirPasteIntoFolder;
     62 
     63     /* Root List Context Menu items */
     64     private TestMenuItem rootEjectRoot;
     65     private TestMenuItem rootOpenInNewWindow;
     66     private TestMenuItem rootPasteIntoFolder;
     67     private TestMenuItem rootSettings;
     68 
     69     /* Action Mode menu items */
     70     private TestMenuItem actionModeOpen;
     71     private TestMenuItem actionModeOpenWith;
     72     private TestMenuItem actionModeShare;
     73     private TestMenuItem actionModeDelete;
     74     private TestMenuItem actionModeSelectAll;
     75     private TestMenuItem actionModeCopyTo;
     76     private TestMenuItem actionModeExtractTo;
     77     private TestMenuItem actionModeMoveTo;
     78     private TestMenuItem actionModeCompress;
     79     private TestMenuItem actionModeRename;
     80     private TestMenuItem actionModeViewInOwner;
     81 
     82     /* Option Menu items */
     83     private TestMenuItem optionSearch;
     84     private TestMenuItem optionDebug;
     85     private TestMenuItem optionGrid;
     86     private TestMenuItem optionList;
     87     private TestMenuItem optionNewWindow;
     88     private TestMenuItem optionCreateDir;
     89     private TestMenuItem optionSelectAll;
     90     private TestMenuItem optionAdvanced;
     91     private TestMenuItem optionSettings;
     92 
     93     private TestSelectionDetails selectionDetails;
     94     private TestDirectoryDetails dirDetails;
     95     private TestSearchViewManager testSearchManager;
     96     private State state = new State();
     97     private RootInfo testRootInfo;
     98     private DocumentInfo testDocInfo;
     99     private MenuManager mgr;
    100 
    101     @Before
    102     public void setUp() {
    103         testMenu = TestMenu.create();
    104         dirShare = testMenu.findItem(R.id.dir_menu_share);
    105         dirOpen = testMenu.findItem(R.id.dir_menu_open);
    106         dirOpenWith = testMenu.findItem(R.id.dir_menu_open_with);
    107         dirCutToClipboard = testMenu.findItem(R.id.dir_menu_cut_to_clipboard);
    108         dirCopyToClipboard = testMenu.findItem(R.id.dir_menu_copy_to_clipboard);
    109         dirPasteFromClipboard = testMenu.findItem(R.id.dir_menu_paste_from_clipboard);
    110         dirCreateDir = testMenu.findItem(R.id.dir_menu_create_dir);
    111         dirSelectAll = testMenu.findItem(R.id.dir_menu_select_all);
    112         dirRename = testMenu.findItem(R.id.dir_menu_rename);
    113         dirDelete = testMenu.findItem(R.id.dir_menu_delete);
    114         dirViewInOwner = testMenu.findItem(R.id.dir_menu_view_in_owner);
    115         dirOpenInNewWindow = testMenu.findItem(R.id.dir_menu_open_in_new_window);
    116         dirPasteIntoFolder = testMenu.findItem(R.id.dir_menu_paste_into_folder);
    117 
    118         rootEjectRoot = testMenu.findItem(R.id.root_menu_eject_root);
    119         rootOpenInNewWindow = testMenu.findItem(R.id.root_menu_open_in_new_window);
    120         rootPasteIntoFolder = testMenu.findItem(R.id.root_menu_paste_into_folder);
    121         rootSettings = testMenu.findItem(R.id.root_menu_settings);
    122 
    123         actionModeOpen = testMenu.findItem(R.id.action_menu_open);
    124         actionModeOpenWith = testMenu.findItem(R.id.action_menu_open_with);
    125         actionModeShare = testMenu.findItem(R.id.action_menu_share);
    126         actionModeDelete = testMenu.findItem(R.id.action_menu_delete);
    127         actionModeSelectAll = testMenu.findItem(R.id.action_menu_select_all);
    128         actionModeCopyTo = testMenu.findItem(R.id.action_menu_copy_to);
    129         actionModeExtractTo = testMenu.findItem(R.id.action_menu_extract_to);
    130         actionModeMoveTo = testMenu.findItem(R.id.action_menu_move_to);
    131         actionModeCompress = testMenu.findItem(R.id.action_menu_compress);
    132         actionModeRename = testMenu.findItem(R.id.action_menu_rename);
    133         actionModeViewInOwner = testMenu.findItem(R.id.action_menu_view_in_owner);
    134 
    135         optionSearch = testMenu.findItem(R.id.option_menu_search);
    136         optionDebug = testMenu.findItem(R.id.option_menu_debug);
    137         optionGrid = testMenu.findItem(R.id.option_menu_grid);
    138         optionList = testMenu.findItem(R.id.option_menu_list);
    139         optionNewWindow = testMenu.findItem(R.id.option_menu_new_window);
    140         optionCreateDir = testMenu.findItem(R.id.option_menu_create_dir);
    141         optionSelectAll = testMenu.findItem(R.id.option_menu_select_all);
    142         optionAdvanced = testMenu.findItem(R.id.option_menu_advanced);
    143         optionSettings = testMenu.findItem(R.id.option_menu_settings);
    144 
    145         selectionDetails = new TestSelectionDetails();
    146         dirDetails = new TestDirectoryDetails();
    147         testSearchManager = new TestSearchViewManager();
    148         mgr = new MenuManager(testSearchManager, state, dirDetails);
    149 
    150         testRootInfo = new RootInfo();
    151         testDocInfo = new DocumentInfo();
    152         state.action = ACTION_CREATE;
    153         state.allowMultiple = true;
    154     }
    155 
    156     @Test
    157     public void testActionMenu() {
    158         mgr.updateActionMenu(testMenu, selectionDetails);
    159 
    160         actionModeOpen.assertInvisible();
    161         actionModeDelete.assertInvisible();
    162         actionModeShare.assertInvisible();
    163         actionModeRename.assertInvisible();
    164         actionModeSelectAll.assertVisible();
    165         actionModeViewInOwner.assertInvisible();
    166     }
    167 
    168     @Test
    169     public void testActionMenu_openAction() {
    170         state.action = ACTION_OPEN;
    171         mgr.updateActionMenu(testMenu, selectionDetails);
    172 
    173         actionModeOpen.assertVisible();
    174     }
    175 
    176 
    177     @Test
    178     public void testActionMenu_notAllowMultiple() {
    179         state.allowMultiple = false;
    180         mgr.updateActionMenu(testMenu, selectionDetails);
    181 
    182         actionModeSelectAll.assertInvisible();
    183     }
    184 
    185     @Test
    186     public void testOptionMenu() {
    187         mgr.updateOptionMenu(testMenu);
    188 
    189         optionAdvanced.assertInvisible();
    190         optionAdvanced.assertTitle(R.string.menu_advanced_show);
    191         optionCreateDir.assertDisabled();
    192         assertTrue(testSearchManager.showMenuCalled());
    193     }
    194 
    195     @Test
    196     public void testOptionMenu_notPicking() {
    197         state.action = ACTION_OPEN;
    198         state.derivedMode = State.MODE_LIST;
    199         mgr.updateOptionMenu(testMenu);
    200 
    201         optionCreateDir.assertInvisible();
    202         optionGrid.assertVisible();
    203         optionList.assertInvisible();
    204         assertFalse(testSearchManager.showMenuCalled());
    205     }
    206 
    207     @Test
    208     public void testOptionMenu_canCreateDirectory() {
    209         dirDetails.canCreateDirectory = true;
    210         mgr.updateOptionMenu(testMenu);
    211 
    212         optionCreateDir.assertEnabled();
    213     }
    214 
    215     @Test
    216     public void testOptionMenu_showAdvanced() {
    217         state.showAdvanced = true;
    218         state.showDeviceStorageOption = true;
    219         mgr.updateOptionMenu(testMenu);
    220 
    221         optionAdvanced.assertVisible();
    222         optionAdvanced.assertTitle(R.string.menu_advanced_hide);
    223     }
    224 
    225     @Test
    226     public void testOptionMenu_inRecents() {
    227         dirDetails.isInRecents = true;
    228         mgr.updateOptionMenu(testMenu);
    229 
    230         optionGrid.assertInvisible();
    231         optionList.assertInvisible();
    232     }
    233 
    234     @Test
    235     public void testContextMenu_EmptyArea() {
    236         dirDetails.hasItemsToPaste = false;
    237         dirDetails.canCreateDoc = false;
    238         dirDetails.canCreateDirectory = false;
    239 
    240         mgr.updateContextMenuForContainer(testMenu);
    241 
    242         dirSelectAll.assertVisible();
    243         dirSelectAll.assertEnabled();
    244         dirPasteFromClipboard.assertVisible();
    245         dirPasteFromClipboard.assertDisabled();
    246         dirCreateDir.assertVisible();
    247         dirCreateDir.assertDisabled();
    248     }
    249 
    250     @Test
    251     public void testContextMenu_EmptyArea_NoItemToPaste() {
    252         dirDetails.hasItemsToPaste = false;
    253         dirDetails.canCreateDoc = true;
    254 
    255         mgr.updateContextMenuForContainer(testMenu);
    256 
    257         dirSelectAll.assertVisible();
    258         dirSelectAll.assertEnabled();
    259         dirPasteFromClipboard.assertVisible();
    260         dirPasteFromClipboard.assertDisabled();
    261         dirCreateDir.assertVisible();
    262         dirCreateDir.assertDisabled();
    263     }
    264 
    265     @Test
    266     public void testContextMenu_EmptyArea_CantCreateDoc() {
    267         dirDetails.hasItemsToPaste = true;
    268         dirDetails.canCreateDoc = false;
    269 
    270         mgr.updateContextMenuForContainer(testMenu);
    271 
    272         dirSelectAll.assertVisible();
    273         dirSelectAll.assertEnabled();
    274         dirPasteFromClipboard.assertVisible();
    275         dirPasteFromClipboard.assertDisabled();
    276         dirCreateDir.assertVisible();
    277         dirCreateDir.assertDisabled();
    278     }
    279 
    280     @Test
    281     public void testContextMenu_EmptyArea_canPaste() {
    282         dirDetails.hasItemsToPaste = true;
    283         dirDetails.canCreateDoc = true;
    284 
    285         mgr.updateContextMenuForContainer(testMenu);
    286 
    287         dirSelectAll.assertVisible();
    288         dirSelectAll.assertEnabled();
    289         dirPasteFromClipboard.assertVisible();
    290         dirPasteFromClipboard.assertEnabled();
    291         dirCreateDir.assertVisible();
    292         dirCreateDir.assertDisabled();
    293     }
    294 
    295     @Test
    296     public void testContextMenu_EmptyArea_CanCreateDirectory() {
    297         dirDetails.canCreateDirectory = true;
    298 
    299         mgr.updateContextMenuForContainer(testMenu);
    300 
    301         dirSelectAll.assertVisible();
    302         dirSelectAll.assertEnabled();
    303         dirPasteFromClipboard.assertVisible();
    304         dirPasteFromClipboard.assertDisabled();
    305         dirCreateDir.assertVisible();
    306         dirCreateDir.assertEnabled();
    307     }
    308 
    309     @Test
    310     public void testContextMenu_OnFile() {
    311         mgr.updateContextMenuForFiles(testMenu, selectionDetails);
    312         // We don't want share in pickers.
    313         dirShare.assertInvisible();
    314         // We don't want openWith in pickers.
    315         dirOpenWith.assertInvisible();
    316         dirCutToClipboard.assertVisible();
    317         dirCopyToClipboard.assertVisible();
    318         dirRename.assertInvisible();
    319         dirDelete.assertVisible();
    320     }
    321 
    322     @Test
    323     public void testContextMenu_OnDirectory() {
    324         selectionDetails.canPasteInto = true;
    325         mgr.updateContextMenuForDirs(testMenu, selectionDetails);
    326         // We don't want openInNewWindow in pickers
    327         dirOpenInNewWindow.assertInvisible();
    328         dirCutToClipboard.assertVisible();
    329         dirCopyToClipboard.assertVisible();
    330         // Doesn't matter if directory is selected, we don't want pasteInto for PickerActivity
    331         dirPasteIntoFolder.assertInvisible();
    332         dirRename.assertInvisible();
    333         dirDelete.assertVisible();
    334     }
    335 
    336     @Test
    337     public void testContextMenu_OnMixedDocs() {
    338         selectionDetails.containDirectories = true;
    339         selectionDetails.containFiles = true;
    340         selectionDetails.size = 2;
    341         selectionDetails.canDelete = true;
    342         mgr.updateContextMenu(testMenu, selectionDetails);
    343         dirCutToClipboard.assertVisible();
    344         dirCopyToClipboard.assertVisible();
    345         dirDelete.assertVisible();
    346     }
    347 
    348     @Test
    349     public void testContextMenu_OnMixedDocs_hasPartialFile() {
    350         selectionDetails.containDirectories = true;
    351         selectionDetails.containFiles = true;
    352         selectionDetails.size = 2;
    353         selectionDetails.containPartial = true;
    354         selectionDetails.canDelete = true;
    355         mgr.updateContextMenu(testMenu, selectionDetails);
    356         dirCutToClipboard.assertVisible();
    357         dirCutToClipboard.assertDisabled();
    358         dirCopyToClipboard.assertVisible();
    359         dirCopyToClipboard.assertDisabled();
    360         dirDelete.assertVisible();
    361         dirDelete.assertEnabled();
    362     }
    363 
    364     @Test
    365     public void testContextMenu_OnMixedDocs_hasUndeletableFile() {
    366         selectionDetails.containDirectories = true;
    367         selectionDetails.containFiles = true;
    368         selectionDetails.size = 2;
    369         selectionDetails.canDelete = false;
    370         mgr.updateContextMenu(testMenu, selectionDetails);
    371         dirCutToClipboard.assertVisible();
    372         dirCutToClipboard.assertDisabled();
    373         dirCopyToClipboard.assertVisible();
    374         dirCopyToClipboard.assertEnabled();
    375         dirDelete.assertVisible();
    376         dirDelete.assertDisabled();
    377     }
    378 
    379     @Test
    380     public void testRootContextMenu() {
    381         mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo);
    382 
    383         rootEjectRoot.assertInvisible();
    384         rootOpenInNewWindow.assertInvisible();
    385         rootPasteIntoFolder.assertInvisible();
    386         rootSettings.assertInvisible();
    387     }
    388 
    389     @Test
    390     public void testRootContextMenu_hasRootSettings() {
    391         testRootInfo.flags = Root.FLAG_HAS_SETTINGS;
    392         mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo);
    393 
    394         rootSettings.assertInvisible();
    395     }
    396 
    397     @Test
    398     public void testRootContextMenu_nonWritableRoot() {
    399         dirDetails.hasItemsToPaste = true;
    400         mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo);
    401 
    402         rootPasteIntoFolder.assertInvisible();
    403     }
    404 
    405     @Test
    406     public void testRootContextMenu_nothingToPaste() {
    407         testRootInfo.flags = Root.FLAG_SUPPORTS_CREATE;
    408         dirDetails.hasItemsToPaste = false;
    409         mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo);
    410 
    411         rootPasteIntoFolder.assertInvisible();
    412     }
    413 
    414     @Test
    415     public void testRootContextMenu_canEject() {
    416         testRootInfo.flags = Root.FLAG_SUPPORTS_EJECT;
    417         mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo);
    418 
    419         rootEjectRoot.assertInvisible();
    420     }
    421 }
    422