• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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