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 private TestMenuItem open; 48 private TestMenuItem openInNewWindow; 49 private TestMenuItem openWith; 50 private TestMenuItem share; 51 private TestMenuItem delete; 52 private TestMenuItem rename; 53 private TestMenuItem selectAll; 54 private TestMenuItem createDir; 55 private TestMenuItem grid; 56 private TestMenuItem list; 57 private TestMenuItem cut; 58 private TestMenuItem copy; 59 private TestMenuItem paste; 60 private TestMenuItem pasteInto; 61 private TestMenuItem advanced; 62 private TestMenuItem settings; 63 private TestMenuItem eject; 64 private TestMenuItem view; 65 66 private TestSelectionDetails selectionDetails; 67 private TestDirectoryDetails dirDetails; 68 private TestSearchViewManager testSearchManager; 69 private State state = new State(); 70 private RootInfo testRootInfo; 71 private DocumentInfo testDocInfo; 72 private MenuManager mgr; 73 74 @Before setUp()75 public void setUp() { 76 testMenu = TestMenu.create(); 77 open = testMenu.findItem(R.id.menu_open); 78 openInNewWindow = testMenu.findItem(R.id.menu_open_in_new_window); 79 openWith = testMenu.findItem(R.id.menu_open_with); 80 share = testMenu.findItem(R.id.menu_share); 81 delete = testMenu.findItem(R.id.menu_delete); 82 rename = testMenu.findItem(R.id.menu_rename); 83 selectAll = testMenu.findItem(R.id.menu_select_all); 84 createDir = testMenu.findItem(R.id.menu_create_dir); 85 grid = testMenu.findItem(R.id.menu_grid); 86 list = testMenu.findItem(R.id.menu_list); 87 cut = testMenu.findItem(R.id.menu_cut_to_clipboard); 88 copy = testMenu.findItem(R.id.menu_copy_to_clipboard); 89 paste = testMenu.findItem(R.id.menu_paste_from_clipboard); 90 pasteInto = testMenu.findItem(R.id.menu_paste_into_folder); 91 view = testMenu.findItem(R.id.menu_view_in_owner); 92 93 advanced = testMenu.findItem(R.id.menu_advanced); 94 settings = testMenu.findItem(R.id.menu_settings); 95 eject = testMenu.findItem(R.id.menu_eject_root); 96 97 selectionDetails = new TestSelectionDetails(); 98 dirDetails = new TestDirectoryDetails(); 99 testSearchManager = new TestSearchViewManager(); 100 mgr = new MenuManager(testSearchManager, state, dirDetails); 101 102 testRootInfo = new RootInfo(); 103 testDocInfo = new DocumentInfo(); 104 state.action = ACTION_CREATE; 105 state.allowMultiple = true; 106 } 107 108 @Test testActionMenu()109 public void testActionMenu() { 110 mgr.updateActionMenu(testMenu, selectionDetails); 111 112 open.assertInvisible(); 113 delete.assertInvisible(); 114 share.assertInvisible(); 115 rename.assertInvisible(); 116 selectAll.assertVisible(); 117 view.assertInvisible(); 118 } 119 120 @Test testActionMenu_openAction()121 public void testActionMenu_openAction() { 122 state.action = ACTION_OPEN; 123 mgr.updateActionMenu(testMenu, selectionDetails); 124 125 open.assertVisible(); 126 } 127 128 129 @Test testActionMenu_notAllowMultiple()130 public void testActionMenu_notAllowMultiple() { 131 state.allowMultiple = false; 132 mgr.updateActionMenu(testMenu, selectionDetails); 133 134 selectAll.assertInvisible(); 135 } 136 137 @Test testOptionMenu()138 public void testOptionMenu() { 139 mgr.updateOptionMenu(testMenu); 140 141 advanced.assertInvisible(); 142 advanced.assertTitle(R.string.menu_advanced_show); 143 createDir.assertDisabled(); 144 assertTrue(testSearchManager.showMenuCalled()); 145 } 146 147 @Test testOptionMenu_notPicking()148 public void testOptionMenu_notPicking() { 149 state.action = ACTION_OPEN; 150 state.derivedMode = State.MODE_LIST; 151 mgr.updateOptionMenu(testMenu); 152 153 createDir.assertInvisible(); 154 grid.assertVisible(); 155 list.assertInvisible(); 156 assertFalse(testSearchManager.showMenuCalled()); 157 } 158 159 @Test testOptionMenu_canCreateDirectory()160 public void testOptionMenu_canCreateDirectory() { 161 dirDetails.canCreateDirectory = true; 162 mgr.updateOptionMenu(testMenu); 163 164 createDir.assertEnabled(); 165 } 166 167 @Test testOptionMenu_showAdvanced()168 public void testOptionMenu_showAdvanced() { 169 state.showAdvanced = true; 170 state.showDeviceStorageOption = true; 171 mgr.updateOptionMenu(testMenu); 172 173 advanced.assertVisible(); 174 advanced.assertTitle(R.string.menu_advanced_hide); 175 } 176 177 @Test testOptionMenu_inRecents()178 public void testOptionMenu_inRecents() { 179 dirDetails.isInRecents = true; 180 mgr.updateOptionMenu(testMenu); 181 182 grid.assertInvisible(); 183 list.assertInvisible(); 184 } 185 186 @Test testContextMenu_EmptyArea()187 public void testContextMenu_EmptyArea() { 188 dirDetails.hasItemsToPaste = false; 189 dirDetails.canCreateDoc = false; 190 dirDetails.canCreateDirectory = false; 191 192 mgr.updateContextMenuForContainer(testMenu); 193 194 selectAll.assertVisible(); 195 selectAll.assertEnabled(); 196 paste.assertVisible(); 197 paste.assertDisabled(); 198 createDir.assertVisible(); 199 createDir.assertDisabled(); 200 } 201 202 @Test testContextMenu_EmptyArea_NoItemToPaste()203 public void testContextMenu_EmptyArea_NoItemToPaste() { 204 dirDetails.hasItemsToPaste = false; 205 dirDetails.canCreateDoc = true; 206 207 mgr.updateContextMenuForContainer(testMenu); 208 209 selectAll.assertVisible(); 210 selectAll.assertEnabled(); 211 paste.assertVisible(); 212 paste.assertDisabled(); 213 createDir.assertVisible(); 214 createDir.assertDisabled(); 215 } 216 217 @Test testContextMenu_EmptyArea_CantCreateDoc()218 public void testContextMenu_EmptyArea_CantCreateDoc() { 219 dirDetails.hasItemsToPaste = true; 220 dirDetails.canCreateDoc = false; 221 222 mgr.updateContextMenuForContainer(testMenu); 223 224 selectAll.assertVisible(); 225 selectAll.assertEnabled(); 226 paste.assertVisible(); 227 paste.assertDisabled(); 228 createDir.assertVisible(); 229 createDir.assertDisabled(); 230 } 231 232 @Test testContextMenu_EmptyArea_canPaste()233 public void testContextMenu_EmptyArea_canPaste() { 234 dirDetails.hasItemsToPaste = true; 235 dirDetails.canCreateDoc = true; 236 237 mgr.updateContextMenuForContainer(testMenu); 238 239 selectAll.assertVisible(); 240 selectAll.assertEnabled(); 241 paste.assertVisible(); 242 paste.assertEnabled(); 243 createDir.assertVisible(); 244 createDir.assertDisabled(); 245 } 246 247 @Test testContextMenu_EmptyArea_CanCreateDirectory()248 public void testContextMenu_EmptyArea_CanCreateDirectory() { 249 dirDetails.canCreateDirectory = true; 250 251 mgr.updateContextMenuForContainer(testMenu); 252 253 selectAll.assertVisible(); 254 selectAll.assertEnabled(); 255 paste.assertVisible(); 256 paste.assertDisabled(); 257 createDir.assertVisible(); 258 createDir.assertEnabled(); 259 } 260 261 @Test testContextMenu_OnFile()262 public void testContextMenu_OnFile() { 263 mgr.updateContextMenuForFiles(testMenu, selectionDetails); 264 // We don't want share in pickers. 265 share.assertInvisible(); 266 // We don't want openWith in pickers. 267 openWith.assertInvisible(); 268 cut.assertVisible(); 269 copy.assertVisible(); 270 rename.assertInvisible(); 271 delete.assertVisible(); 272 } 273 274 @Test testContextMenu_OnDirectory()275 public void testContextMenu_OnDirectory() { 276 selectionDetails.canPasteInto = true; 277 mgr.updateContextMenuForDirs(testMenu, selectionDetails); 278 // We don't want openInNewWindow in pickers 279 openInNewWindow.assertInvisible(); 280 cut.assertVisible(); 281 copy.assertVisible(); 282 // Doesn't matter if directory is selected, we don't want pasteInto for DocsActivity 283 pasteInto.assertInvisible(); 284 rename.assertInvisible(); 285 delete.assertVisible(); 286 } 287 288 @Test testContextMenu_OnMixedDocs()289 public void testContextMenu_OnMixedDocs() { 290 selectionDetails.containDirectories = true; 291 selectionDetails.containFiles = true; 292 selectionDetails.size = 2; 293 selectionDetails.canDelete = true; 294 mgr.updateContextMenu(testMenu, selectionDetails); 295 cut.assertVisible(); 296 copy.assertVisible(); 297 delete.assertVisible(); 298 } 299 300 @Test testContextMenu_OnMixedDocs_hasPartialFile()301 public void testContextMenu_OnMixedDocs_hasPartialFile() { 302 selectionDetails.containDirectories = true; 303 selectionDetails.containFiles = true; 304 selectionDetails.size = 2; 305 selectionDetails.containPartial = true; 306 selectionDetails.canDelete = true; 307 mgr.updateContextMenu(testMenu, selectionDetails); 308 cut.assertVisible(); 309 cut.assertDisabled(); 310 copy.assertVisible(); 311 copy.assertDisabled(); 312 delete.assertVisible(); 313 delete.assertEnabled(); 314 } 315 316 @Test testContextMenu_OnMixedDocs_hasUndeletableFile()317 public void testContextMenu_OnMixedDocs_hasUndeletableFile() { 318 selectionDetails.containDirectories = true; 319 selectionDetails.containFiles = true; 320 selectionDetails.size = 2; 321 selectionDetails.canDelete = false; 322 mgr.updateContextMenu(testMenu, selectionDetails); 323 cut.assertVisible(); 324 cut.assertDisabled(); 325 copy.assertVisible(); 326 copy.assertEnabled(); 327 delete.assertVisible(); 328 delete.assertDisabled(); 329 } 330 331 @Test testRootContextMenu()332 public void testRootContextMenu() { 333 mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo); 334 335 eject.assertInvisible(); 336 openInNewWindow.assertInvisible(); 337 pasteInto.assertInvisible(); 338 settings.assertInvisible(); 339 } 340 341 @Test testRootContextMenu_hasRootSettings()342 public void testRootContextMenu_hasRootSettings() { 343 testRootInfo.flags = Root.FLAG_HAS_SETTINGS; 344 mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo); 345 346 settings.assertInvisible(); 347 } 348 349 @Test testRootContextMenu_nonWritableRoot()350 public void testRootContextMenu_nonWritableRoot() { 351 dirDetails.hasItemsToPaste = true; 352 mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo); 353 354 pasteInto.assertInvisible(); 355 } 356 357 @Test testRootContextMenu_nothingToPaste()358 public void testRootContextMenu_nothingToPaste() { 359 testRootInfo.flags = Root.FLAG_SUPPORTS_CREATE; 360 dirDetails.hasItemsToPaste = false; 361 mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo); 362 363 pasteInto.assertInvisible(); 364 } 365 366 @Test testRootContextMenu_canEject()367 public void testRootContextMenu_canEject() { 368 testRootInfo.flags = Root.FLAG_SUPPORTS_EJECT; 369 mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo); 370 371 eject.assertInvisible(); 372 } 373 } 374