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 setUp()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 testActionMenu()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 testActionMenu_openAction()169 public void testActionMenu_openAction() { 170 state.action = ACTION_OPEN; 171 mgr.updateActionMenu(testMenu, selectionDetails); 172 173 actionModeOpen.assertVisible(); 174 } 175 176 177 @Test testActionMenu_notAllowMultiple()178 public void testActionMenu_notAllowMultiple() { 179 state.allowMultiple = false; 180 mgr.updateActionMenu(testMenu, selectionDetails); 181 182 actionModeSelectAll.assertInvisible(); 183 } 184 185 @Test testOptionMenu()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 testOptionMenu_notPicking()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 testOptionMenu_canCreateDirectory()208 public void testOptionMenu_canCreateDirectory() { 209 dirDetails.canCreateDirectory = true; 210 mgr.updateOptionMenu(testMenu); 211 212 optionCreateDir.assertEnabled(); 213 } 214 215 @Test testOptionMenu_showAdvanced()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 testOptionMenu_inRecents()226 public void testOptionMenu_inRecents() { 227 dirDetails.isInRecents = true; 228 mgr.updateOptionMenu(testMenu); 229 230 optionGrid.assertInvisible(); 231 optionList.assertInvisible(); 232 } 233 234 @Test testContextMenu_EmptyArea()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 testContextMenu_EmptyArea_NoItemToPaste()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 testContextMenu_EmptyArea_CantCreateDoc()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 testContextMenu_EmptyArea_canPaste()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 testContextMenu_EmptyArea_CanCreateDirectory()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 testContextMenu_OnFile()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 testContextMenu_OnDirectory()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 testContextMenu_OnMixedDocs()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 testContextMenu_OnMixedDocs_hasPartialFile()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 testContextMenu_OnMixedDocs_hasUndeletableFile()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 testRootContextMenu()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 testRootContextMenu_hasRootSettings()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 testRootContextMenu_nonWritableRoot()398 public void testRootContextMenu_nonWritableRoot() { 399 dirDetails.hasItemsToPaste = true; 400 mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo); 401 402 rootPasteIntoFolder.assertInvisible(); 403 } 404 405 @Test testRootContextMenu_nothingToPaste()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 testRootContextMenu_canEject()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