MenuManagerTest.java revision 710248d5ee766765b86fa36fe2ddd8d65f926755
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
17package com.android.documentsui.files;
18
19import static junit.framework.Assert.assertEquals;
20import static org.junit.Assert.assertTrue;
21
22import android.provider.DocumentsContract.Document;
23import android.provider.DocumentsContract.Root;
24import android.support.test.filters.SmallTest;
25import android.support.test.runner.AndroidJUnit4;
26
27import com.android.documentsui.R;
28import com.android.documentsui.base.DocumentInfo;
29import com.android.documentsui.base.RootInfo;
30import com.android.documentsui.base.State;
31import com.android.documentsui.testing.TestDirectoryDetails;
32import com.android.documentsui.testing.TestFeatures;
33import com.android.documentsui.testing.TestMenu;
34import com.android.documentsui.testing.TestMenuInflater;
35import com.android.documentsui.testing.TestMenuItem;
36import com.android.documentsui.testing.TestScopedPreferences;
37import com.android.documentsui.testing.TestSearchViewManager;
38import com.android.documentsui.testing.TestSelectionDetails;
39
40import org.junit.Before;
41import org.junit.Test;
42import org.junit.runner.RunWith;
43
44@RunWith(AndroidJUnit4.class)
45@SmallTest
46public final class MenuManagerTest {
47
48    private TestMenu testMenu;
49    private TestMenuItem rename;
50    private TestMenuItem selectAll;
51    private TestMenuItem moveTo;
52    private TestMenuItem copyTo;
53    private TestMenuItem compress;
54    private TestMenuItem extractTo;
55    private TestMenuItem share;
56    private TestMenuItem delete;
57    private TestMenuItem createDir;
58    private TestMenuItem settings;
59    private TestMenuItem newWindow;
60    private TestMenuItem open;
61    private TestMenuItem openWith;
62    private TestMenuItem openInNewWindow;
63    private TestMenuItem cut;
64    private TestMenuItem copy;
65    private TestMenuItem paste;
66    private TestMenuItem pasteInto;
67    private TestMenuItem advanced;
68    private TestMenuItem eject;
69
70    private TestFeatures features;
71    private TestSelectionDetails selectionDetails;
72    private TestDirectoryDetails dirDetails;
73    private TestSearchViewManager testSearchManager;
74    private TestScopedPreferences preferences;
75    private RootInfo testRootInfo;
76    private DocumentInfo testDocInfo;
77    private State state = new State();
78    private MenuManager mgr;
79
80    @Before
81    public void setUp() {
82        testMenu = TestMenu.create();
83        rename = testMenu.findItem(R.id.menu_rename);
84        selectAll = testMenu.findItem(R.id.menu_select_all);
85        moveTo = testMenu.findItem(R.id.menu_move_to);
86        copyTo = testMenu.findItem(R.id.menu_copy_to);
87        compress = testMenu.findItem(R.id.menu_compress);
88        extractTo = testMenu.findItem(R.id.menu_extract_to);
89        share = testMenu.findItem(R.id.menu_share);
90        delete = testMenu.findItem(R.id.menu_delete);
91        createDir = testMenu.findItem(R.id.menu_create_dir);
92        settings = testMenu.findItem(R.id.menu_settings);
93        newWindow = testMenu.findItem(R.id.menu_new_window);
94        open = testMenu.findItem(R.id.menu_open);
95        openWith = testMenu.findItem(R.id.menu_open_with);
96        openInNewWindow = testMenu.findItem(R.id.menu_open_in_new_window);
97        cut = testMenu.findItem(R.id.menu_cut_to_clipboard);
98        copy = testMenu.findItem(R.id.menu_copy_to_clipboard);
99        paste = testMenu.findItem(R.id.menu_paste_from_clipboard);
100        pasteInto = testMenu.findItem(R.id.menu_paste_into_folder);
101        advanced = testMenu.findItem(R.id.menu_advanced);
102        eject = testMenu.findItem(R.id.menu_eject_root);
103
104        features = new TestFeatures();
105
106        // These items by default are visible
107        testMenu.findItem(R.id.menu_select_all).setVisible(true);
108        testMenu.findItem(R.id.menu_list).setVisible(true);
109
110        selectionDetails = new TestSelectionDetails();
111        dirDetails = new TestDirectoryDetails();
112        testSearchManager = new TestSearchViewManager();
113        preferences = new TestScopedPreferences();
114        mgr = new MenuManager(features, testSearchManager, state, dirDetails);
115
116        testRootInfo = new RootInfo();
117        testDocInfo = new DocumentInfo();
118    }
119
120    @Test
121    public void testActionMenu() {
122        selectionDetails.canDelete = true;
123        selectionDetails.canRename = true;
124        dirDetails.canCreateDoc = true;
125
126        mgr.updateActionMenu(testMenu, selectionDetails);
127
128        rename.assertEnabled();
129        delete.assertVisible();
130        share.assertVisible();
131        copyTo.assertEnabled();
132        compress.assertEnabled();
133        extractTo.assertInvisible();
134        moveTo.assertEnabled();
135    }
136
137    @Test
138    public void testActionMenu_ContainsPartial() {
139        selectionDetails.containPartial = true;
140        dirDetails.canCreateDoc = true;
141        mgr.updateActionMenu(testMenu, selectionDetails);
142
143        rename.assertDisabled();
144        share.assertInvisible();
145        copyTo.assertDisabled();
146        compress.assertDisabled();
147        extractTo.assertDisabled();
148        moveTo.assertDisabled();
149    }
150
151    @Test
152    public void testActionMenu_CreateArchives_ReflectsFeatureState() {
153        features.archiveCreation = false;
154        dirDetails.canCreateDoc = true;
155        mgr.updateActionMenu(testMenu, selectionDetails);
156
157        compress.assertInvisible();
158        compress.assertDisabled();
159    }
160
161    @Test
162    public void testActionMenu_CreateArchive() {
163        dirDetails.canCreateDoc = true;
164        mgr.updateActionMenu(testMenu, selectionDetails);
165
166        compress.assertEnabled();
167    }
168
169    @Test
170    public void testActionMenu_NoCreateArchive() {
171        dirDetails.canCreateDoc = false;
172        mgr.updateActionMenu(testMenu, selectionDetails);
173
174        compress.assertDisabled();
175    }
176
177    @Test
178    public void testActionMenu_cantRename() {
179        selectionDetails.canRename = false;
180        mgr.updateActionMenu(testMenu, selectionDetails);
181
182        rename.assertDisabled();
183    }
184
185    @Test
186    public void testActionMenu_cantDelete() {
187        selectionDetails.canDelete = false;
188        mgr.updateActionMenu(testMenu, selectionDetails);
189
190        delete.assertInvisible();
191        // We shouldn't be able to move files if we can't delete them
192        moveTo.assertDisabled();
193    }
194
195    @Test
196    public void testActionMenu_changeToCanDelete() {
197        selectionDetails.canDelete = false;
198        mgr.updateActionMenu(testMenu, selectionDetails);
199
200        selectionDetails.canDelete = true;
201        mgr.updateActionMenu(testMenu, selectionDetails);
202
203        delete.assertVisible();
204        delete.assertEnabled();
205        moveTo.assertVisible();
206        moveTo.assertEnabled();
207    }
208
209    @Test
210    public void testActionMenu_ContainsDirectory() {
211        selectionDetails.containDirectories = true;
212        mgr.updateActionMenu(testMenu, selectionDetails);
213
214        // We can't share directories
215        share.assertInvisible();
216    }
217
218    @Test
219    public void testActionMenu_RemovesDirectory() {
220        selectionDetails.containDirectories = true;
221        mgr.updateActionMenu(testMenu, selectionDetails);
222
223        selectionDetails.containDirectories = false;
224        mgr.updateActionMenu(testMenu, selectionDetails);
225
226        share.assertVisible();
227        share.assertEnabled();
228    }
229
230    @Test
231    public void testActionMenu_CantExtract() {
232        selectionDetails.canExtract = false;
233        mgr.updateActionMenu(testMenu, selectionDetails);
234
235        extractTo.assertInvisible();
236    }
237
238    @Test
239    public void testActionMenu_CanExtract_hidesCopyToAndCompressAndShare() {
240        features.archiveCreation = true;
241        selectionDetails.canExtract = true;
242        dirDetails.canCreateDoc = true;
243        mgr.updateActionMenu(testMenu, selectionDetails);
244
245        extractTo.assertEnabled();
246        copyTo.assertDisabled();
247        compress.assertDisabled();
248    }
249
250    @Test
251    public void testActionMenu_CanOpenWith() {
252        selectionDetails.canOpenWith = true;
253        mgr.updateActionMenu(testMenu, selectionDetails);
254
255        openWith.assertVisible();
256        openWith.assertEnabled();
257    }
258
259    @Test
260    public void testActionMenu_NoOpenWith() {
261        selectionDetails.canOpenWith = false;
262        mgr.updateActionMenu(testMenu, selectionDetails);
263
264        openWith.assertVisible();
265        openWith.assertDisabled();
266    }
267
268    @Test
269    public void testOptionMenu() {
270        mgr.updateOptionMenu(testMenu);
271
272        advanced.assertInvisible();
273        advanced.assertTitle(R.string.menu_advanced_show);
274        createDir.assertDisabled();
275        assertTrue(testSearchManager.updateMenuCalled());
276    }
277
278    @Test
279    public void testOptionMenu_ShowAdvanced() {
280        state.showAdvanced = true;
281        state.showDeviceStorageOption = true;
282        mgr.updateOptionMenu(testMenu);
283
284        advanced.assertVisible();
285        advanced.assertTitle(R.string.menu_advanced_hide);
286    }
287
288    @Test
289    public void testOptionMenu_CanCreateDirectory() {
290        dirDetails.canCreateDirectory = true;
291        mgr.updateOptionMenu(testMenu);
292
293        createDir.assertEnabled();
294    }
295
296    @Test
297    public void testOptionMenu_HasRootSettings() {
298        dirDetails.hasRootSettings = true;
299        mgr.updateOptionMenu(testMenu);
300
301        settings.assertVisible();
302    }
303
304    @Test
305    public void testInflateContextMenu_Files() {
306        TestMenuInflater inflater = new TestMenuInflater();
307
308        selectionDetails.containFiles = true;
309        selectionDetails.containDirectories = false;
310        mgr.inflateContextMenuForDocs(testMenu, inflater, selectionDetails);
311
312        assertEquals(R.menu.file_context_menu, inflater.lastInflatedMenuId);
313    }
314
315    @Test
316    public void testInflateContextMenu_Dirs() {
317        TestMenuInflater inflater = new TestMenuInflater();
318
319        selectionDetails.containFiles = false;
320        selectionDetails.containDirectories = true;
321        mgr.inflateContextMenuForDocs(testMenu, inflater, selectionDetails);
322
323        assertEquals(R.menu.dir_context_menu, inflater.lastInflatedMenuId);
324    }
325
326    @Test
327    public void testInflateContextMenu_Mixed() {
328        TestMenuInflater inflater = new TestMenuInflater();
329
330        selectionDetails.containFiles = true;
331        selectionDetails.containDirectories = true;
332        mgr.inflateContextMenuForDocs(testMenu, inflater, selectionDetails);
333
334        assertEquals(R.menu.mixed_context_menu, inflater.lastInflatedMenuId);
335    }
336
337    @Test
338    public void testContextMenu_EmptyArea() {
339        mgr.updateContextMenuForContainer(testMenu);
340
341        selectAll.assertVisible();
342        selectAll.assertEnabled();
343        paste.assertVisible();
344        paste.assertDisabled();
345        createDir.assertVisible();
346        createDir.assertDisabled();
347    }
348
349    @Test
350    public void testContextMenu_EmptyArea_NoItemToPaste() {
351        dirDetails.hasItemsToPaste = false;
352        dirDetails.canCreateDoc = true;
353
354        mgr.updateContextMenuForContainer(testMenu);
355
356        selectAll.assertVisible();
357        selectAll.assertEnabled();
358        paste.assertVisible();
359        paste.assertDisabled();
360        createDir.assertVisible();
361        createDir.assertDisabled();
362    }
363
364    @Test
365    public void testContextMenu_EmptyArea_CantCreateDoc() {
366        dirDetails.hasItemsToPaste = true;
367        dirDetails.canCreateDoc = false;
368
369        mgr.updateContextMenuForContainer(testMenu);
370
371        selectAll.assertVisible();
372        selectAll.assertEnabled();
373        paste.assertVisible();
374        paste.assertDisabled();
375        createDir.assertVisible();
376        createDir.assertDisabled();
377    }
378
379    @Test
380    public void testContextMenu_EmptyArea_CanPaste() {
381        dirDetails.hasItemsToPaste = true;
382        dirDetails.canCreateDoc = true;
383
384        mgr.updateContextMenuForContainer(testMenu);
385
386        selectAll.assertVisible();
387        selectAll.assertEnabled();
388        paste.assertVisible();
389        paste.assertEnabled();
390        createDir.assertVisible();
391        createDir.assertDisabled();
392    }
393
394    @Test
395    public void testContextMenu_EmptyArea_CanCreateDirectory() {
396        dirDetails.canCreateDirectory = true;
397
398        mgr.updateContextMenuForContainer(testMenu);
399
400        selectAll.assertVisible();
401        selectAll.assertEnabled();
402        paste.assertVisible();
403        paste.assertDisabled();
404        createDir.assertVisible();
405        createDir.assertEnabled();
406    }
407
408    @Test
409    public void testContextMenu_OnFile() {
410        selectionDetails.size = 1;
411        mgr.updateContextMenuForFiles(testMenu, selectionDetails);
412        open.assertVisible();
413        open.assertEnabled();
414        cut.assertVisible();
415        copy.assertVisible();
416        rename.assertVisible();
417        createDir.assertVisible();
418        delete.assertVisible();
419    }
420
421    @Test
422    public void testContextMenu_OnFile_CanOpenWith() {
423        selectionDetails.canOpenWith = true;
424        mgr.updateContextMenuForFiles(testMenu, selectionDetails);
425        openWith.assertVisible();
426        openWith.assertEnabled();
427    }
428
429    @Test
430    public void testContextMenu_OnFile_NoOpenWith() {
431        selectionDetails.canOpenWith = false;
432        mgr.updateContextMenuForFiles(testMenu, selectionDetails);
433        openWith.assertVisible();
434        openWith.assertDisabled();
435    }
436
437    @Test
438    public void testContextMenu_OnMultipleFiles() {
439        selectionDetails.size = 3;
440        mgr.updateContextMenuForFiles(testMenu, selectionDetails);
441        open.assertVisible();
442        open.assertDisabled();
443    }
444
445    @Test
446    public void testContextMenu_OnWritableDirectory() {
447        selectionDetails.size = 1;
448        selectionDetails.canPasteInto = true;
449        dirDetails.hasItemsToPaste = true;
450        mgr.updateContextMenuForDirs(testMenu, selectionDetails);
451        openInNewWindow.assertVisible();
452        openInNewWindow.assertEnabled();
453        cut.assertVisible();
454        copy.assertVisible();
455        pasteInto.assertVisible();
456        pasteInto.assertEnabled();
457        rename.assertVisible();
458        delete.assertVisible();
459    }
460
461    @Test
462    public void testContextMenu_OnNonWritableDirectory() {
463        selectionDetails.size = 1;
464        selectionDetails.canPasteInto = false;
465        mgr.updateContextMenuForDirs(testMenu, selectionDetails);
466        openInNewWindow.assertVisible();
467        openInNewWindow.assertEnabled();
468        cut.assertVisible();
469        copy.assertVisible();
470        pasteInto.assertVisible();
471        pasteInto.assertDisabled();
472        rename.assertVisible();
473        delete.assertVisible();
474    }
475
476    @Test
477    public void testContextMenu_OnWritableDirectory_NothingToPaste() {
478        selectionDetails.canPasteInto = true;
479        selectionDetails.size = 1;
480        dirDetails.hasItemsToPaste = false;
481        mgr.updateContextMenuForDirs(testMenu, selectionDetails);
482        pasteInto.assertVisible();
483        pasteInto.assertDisabled();
484    }
485
486    @Test
487    public void testContextMenu_OnMultipleDirectories() {
488        selectionDetails.size = 3;
489        mgr.updateContextMenuForDirs(testMenu, selectionDetails);
490        openInNewWindow.assertVisible();
491        openInNewWindow.assertDisabled();
492    }
493
494    @Test
495    public void testContextMenu_OnMixedDocs() {
496        selectionDetails.containDirectories = true;
497        selectionDetails.containFiles = true;
498        selectionDetails.size = 2;
499        selectionDetails.canDelete = true;
500        mgr.updateContextMenu(testMenu, selectionDetails);
501        cut.assertVisible();
502        cut.assertEnabled();
503        copy.assertVisible();
504        copy.assertEnabled();
505        delete.assertVisible();
506        delete.assertEnabled();
507    }
508
509    @Test
510    public void testContextMenu_OnMixedDocs_hasPartialFile() {
511        selectionDetails.containDirectories = true;
512        selectionDetails.containFiles = true;
513        selectionDetails.size = 2;
514        selectionDetails.containPartial = true;
515        selectionDetails.canDelete = true;
516        mgr.updateContextMenu(testMenu, selectionDetails);
517        cut.assertVisible();
518        cut.assertDisabled();
519        copy.assertVisible();
520        copy.assertDisabled();
521        delete.assertVisible();
522        delete.assertEnabled();
523    }
524
525    @Test
526    public void testContextMenu_OnMixedDocs_hasUndeletableFile() {
527        selectionDetails.containDirectories = true;
528        selectionDetails.containFiles = true;
529        selectionDetails.size = 2;
530        selectionDetails.canDelete = false;
531        mgr.updateContextMenu(testMenu, selectionDetails);
532        cut.assertVisible();
533        cut.assertDisabled();
534        copy.assertVisible();
535        copy.assertEnabled();
536        delete.assertVisible();
537        delete.assertDisabled();
538    }
539
540    @Test
541    public void testRootContextMenu() {
542        testRootInfo.flags = Root.FLAG_SUPPORTS_CREATE;
543
544        mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo);
545
546        eject.assertInvisible();
547
548        openInNewWindow.assertVisible();
549        openInNewWindow.assertEnabled();
550
551        pasteInto.assertVisible();
552        pasteInto.assertDisabled();
553
554        settings.assertVisible();
555        settings.assertDisabled();
556    }
557
558    @Test
559    public void testRootContextMenu_HasRootSettings() {
560        testRootInfo.flags = Root.FLAG_HAS_SETTINGS;
561        mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo);
562
563        settings.assertEnabled();
564    }
565
566    @Test
567    public void testRootContextMenu_NonWritableRoot() {
568        dirDetails.hasItemsToPaste = true;
569        mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo);
570
571        pasteInto.assertVisible();
572        pasteInto.assertDisabled();
573    }
574
575    @Test
576    public void testRootContextMenu_NothingToPaste() {
577        testRootInfo.flags = Root.FLAG_SUPPORTS_CREATE;
578        testDocInfo.flags = Document.FLAG_DIR_SUPPORTS_CREATE;
579        dirDetails.hasItemsToPaste = false;
580        mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo);
581
582        pasteInto.assertVisible();
583        pasteInto.assertDisabled();
584    }
585
586    @Test
587    public void testRootContextMenu_PasteIntoWritableRoot() {
588        testRootInfo.flags = Root.FLAG_SUPPORTS_CREATE;
589        testDocInfo.flags = Document.FLAG_DIR_SUPPORTS_CREATE;
590        dirDetails.hasItemsToPaste = true;
591        mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo);
592
593        pasteInto.assertVisible();
594        pasteInto.assertEnabled();
595    }
596
597    @Test
598    public void testRootContextMenu_Eject() {
599        testRootInfo.flags = Root.FLAG_SUPPORTS_EJECT;
600        mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo);
601
602        eject.assertEnabled();
603    }
604
605    @Test
606    public void testRootContextMenu_EjectInProcess() {
607        testRootInfo.flags = Root.FLAG_SUPPORTS_EJECT;
608        testRootInfo.ejecting = true;
609        mgr.updateRootContextMenu(testMenu, testRootInfo, testDocInfo);
610
611        eject.assertDisabled();
612    }
613}
614