Move menu managers to respective packages.

Also add some unit tests to cover mixed docs in context menus.

Change-Id: I764383daed21afa5e355d85f807ad4ef1710593e
diff --git a/src/com/android/documentsui/MenuManager.java b/src/com/android/documentsui/MenuManager.java
index efe5703..55dffb1 100644
--- a/src/com/android/documentsui/MenuManager.java
+++ b/src/com/android/documentsui/MenuManager.java
@@ -31,8 +31,8 @@
 
 public abstract class MenuManager {
 
-    final State mState;
-    final SearchViewManager mSearchManager;
+    final protected State mState;
+    final protected SearchViewManager mSearchManager;
 
     public MenuManager(SearchViewManager searchManager, State displayState) {
         mSearchManager = searchManager;
@@ -98,7 +98,7 @@
      *      unselectable item in pickers
      */
     @VisibleForTesting
-    void updateContextMenuForFiles(Menu menu, SelectionDetails selectionDetails) {
+    public void updateContextMenuForFiles(Menu menu, SelectionDetails selectionDetails) {
         assert(selectionDetails != null);
 
         MenuItem share = menu.findItem(R.id.menu_share);
@@ -125,7 +125,7 @@
      *      an unselectable item in pickers
      */
     @VisibleForTesting
-    void updateContextMenuForDirs(Menu menu, SelectionDetails selectionDetails) {
+    public void updateContextMenuForDirs(Menu menu, SelectionDetails selectionDetails) {
         assert(selectionDetails != null);
 
         MenuItem openInNewWindow = menu.findItem(R.id.menu_open_in_new_window);
@@ -145,7 +145,7 @@
      * Update shared context menu items of both files and folders context menus.
      */
     @VisibleForTesting
-    void updateContextMenu(Menu menu, SelectionDetails selectionDetails) {
+    public void updateContextMenu(Menu menu, SelectionDetails selectionDetails) {
         assert(selectionDetails != null);
 
         MenuItem cut = menu.findItem(R.id.menu_cut_to_clipboard);
@@ -166,7 +166,7 @@
      * Called when user tries to generate a context menu anchored to an empty pane.
      */
     @VisibleForTesting
-    void updateContextMenuForContainer(Menu menu, DirectoryDetails directoryDetails) {
+    public void updateContextMenuForContainer(Menu menu, DirectoryDetails directoryDetails) {
         MenuItem paste = menu.findItem(R.id.menu_paste_from_clipboard);
         MenuItem selectAll = menu.findItem(R.id.menu_select_all);
 
@@ -185,72 +185,75 @@
         updateEject(eject, root);
     }
 
-    void updateModePicker(MenuItem grid, MenuItem list, DirectoryDetails directoryDetails) {
+    protected void updateModePicker(
+            MenuItem grid, MenuItem list, DirectoryDetails directoryDetails) {
         grid.setVisible(mState.derivedMode != State.MODE_GRID);
         list.setVisible(mState.derivedMode != State.MODE_LIST);
     }
 
-    void updateAdvanced(MenuItem advanced, DirectoryDetails directoryDetails) {
+    protected void updateAdvanced(MenuItem advanced, DirectoryDetails directoryDetails) {
         advanced.setVisible(mState.showAdvancedOption);
         advanced.setTitle(mState.showAdvancedOption && mState.showAdvanced
                 ? R.string.menu_advanced_hide : R.string.menu_advanced_show);
     }
 
-    void updateSettings(MenuItem settings, DirectoryDetails directoryDetails) {
+    protected void updateSettings(MenuItem settings, DirectoryDetails directoryDetails) {
         settings.setVisible(false);
     }
 
-    void updateSettings(MenuItem settings, RootInfo root) {
+    protected void updateSettings(MenuItem settings, RootInfo root) {
         settings.setVisible(false);
     }
 
-    void updateEject(MenuItem eject, RootInfo root) {
+    protected void updateEject(MenuItem eject, RootInfo root) {
         eject.setVisible(false);
     }
 
-    void updateNewWindow(MenuItem newWindow, DirectoryDetails directoryDetails) {
+    protected void updateNewWindow(MenuItem newWindow, DirectoryDetails directoryDetails) {
         newWindow.setVisible(false);
     }
 
-    void updateOpenInActionMode(MenuItem open, SelectionDetails selectionDetails) {
+    protected void updateOpenInActionMode(MenuItem open, SelectionDetails selectionDetails) {
         open.setVisible(false);
     }
 
-    void updateOpenWith(MenuItem openWith, SelectionDetails selectionDetails) {
+    protected void updateOpenWith(MenuItem openWith, SelectionDetails selectionDetails) {
         openWith.setVisible(false);
     }
 
-    void updateOpenInNewWindow(MenuItem openInNewWindow, SelectionDetails selectionDetails) {
+    protected void updateOpenInNewWindow(
+            MenuItem openInNewWindow, SelectionDetails selectionDetails) {
         openInNewWindow.setVisible(false);
     }
 
-    void updateShare(MenuItem share, SelectionDetails selectionDetails) {
+    protected void updateShare(MenuItem share, SelectionDetails selectionDetails) {
         share.setVisible(false);
     }
 
-    void updateDelete(MenuItem delete, SelectionDetails selectionDetails) {
+    protected void updateDelete(MenuItem delete, SelectionDetails selectionDetails) {
         delete.setVisible(false);
     }
 
-    void updateRename(MenuItem rename, SelectionDetails selectionDetails) {
+    protected void updateRename(MenuItem rename, SelectionDetails selectionDetails) {
         rename.setVisible(false);
     }
 
-    void updateMoveTo(MenuItem moveTo, SelectionDetails selectionDetails) {
+    protected void updateMoveTo(MenuItem moveTo, SelectionDetails selectionDetails) {
         moveTo.setVisible(false);
     }
 
-    void updateCopyTo(MenuItem copyTo, SelectionDetails selectionDetails) {
+    protected void updateCopyTo(MenuItem copyTo, SelectionDetails selectionDetails) {
         copyTo.setVisible(false);
     }
 
-    void updatePasteInto(MenuItem pasteInto, SelectionDetails selectionDetails) {
+    protected void updatePasteInto(MenuItem pasteInto, SelectionDetails selectionDetails) {
         pasteInto.setVisible(false);
     }
 
-    abstract void updateOpenInContextMenu(MenuItem open, SelectionDetails selectionDetails);
-    abstract void updateSelectAll(MenuItem selectAll);
-    abstract void updateCreateDir(MenuItem createDir, DirectoryDetails directoryDetails);
+    protected abstract void updateOpenInContextMenu(
+            MenuItem open, SelectionDetails selectionDetails);
+    protected abstract void updateSelectAll(MenuItem selectAll);
+    protected abstract void updateCreateDir(MenuItem createDir, DirectoryDetails directoryDetails);
 
     /**
      * Access to meta data about the selection.
diff --git a/src/com/android/documentsui/SearchViewManager.java b/src/com/android/documentsui/SearchViewManager.java
index 6ee455a..a632136 100644
--- a/src/com/android/documentsui/SearchViewManager.java
+++ b/src/com/android/documentsui/SearchViewManager.java
@@ -136,7 +136,7 @@
                 && ((root.flags & Root.FLAG_SUPPORTS_SEARCH) != 0));
     }
 
-    protected void showMenu(boolean visible) {
+    public void showMenu(boolean visible) {
         if (mMenuItem == null) {
             if (DEBUG) Log.d(TAG, "showMenu called before Search MenuItem installed.");
             return;
diff --git a/src/com/android/documentsui/manager/ManageActivity.java b/src/com/android/documentsui/manager/ManageActivity.java
index 9f1c6e7..4f5de12 100644
--- a/src/com/android/documentsui/manager/ManageActivity.java
+++ b/src/com/android/documentsui/manager/ManageActivity.java
@@ -37,8 +37,6 @@
 
 import com.android.documentsui.BaseActivity;
 import com.android.documentsui.DocumentsApplication;
-import com.android.documentsui.FilesMenuManager;
-import com.android.documentsui.MenuManager;
 import com.android.documentsui.MenuManager.DirectoryDetails;
 import com.android.documentsui.Metrics;
 import com.android.documentsui.OperationDialogFragment;
@@ -82,7 +80,7 @@
     // We use the time gap to figure out whether to close app or reopen the drawer.
     private long mDrawerLastFiddled;
     private DocumentClipper mClipper;
-    private FilesMenuManager mMenuManager;
+    private MenuManager mMenuManager;
     private DirectoryDetails mDetails;
 
     public ManageActivity() {
@@ -94,7 +92,7 @@
         super.onCreate(icicle);
 
         mClipper = DocumentsApplication.getDocumentClipper(this);
-        mMenuManager = new FilesMenuManager(mSearchManager, getDisplayState());
+        mMenuManager = new MenuManager(mSearchManager, getDisplayState());
         mDetails = new DirectoryDetails(this) {
             @Override
             public boolean hasItemsToPaste() {
diff --git a/src/com/android/documentsui/FilesMenuManager.java b/src/com/android/documentsui/manager/MenuManager.java
similarity index 72%
rename from src/com/android/documentsui/FilesMenuManager.java
rename to src/com/android/documentsui/manager/MenuManager.java
index 3ad89f6..7fca108 100644
--- a/src/com/android/documentsui/FilesMenuManager.java
+++ b/src/com/android/documentsui/manager/MenuManager.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.documentsui;
+package com.android.documentsui.manager;
 
 import android.app.Fragment;
 import android.view.Menu;
@@ -22,12 +22,14 @@
 import android.view.MenuItem;
 import android.view.View;
 
+import com.android.documentsui.R;
+import com.android.documentsui.SearchViewManager;
 import com.android.documentsui.base.RootInfo;
 import com.android.documentsui.base.State;
 
-public final class FilesMenuManager extends MenuManager {
+public final class MenuManager extends com.android.documentsui.MenuManager {
 
-    public FilesMenuManager(SearchViewManager searchManager, State displayState) {
+    public MenuManager(SearchViewManager searchManager, State displayState) {
         super(searchManager, displayState);
     }
 
@@ -78,86 +80,87 @@
     }
 
     @Override
-    void updateSettings(MenuItem settings, RootInfo root) {
+    protected void updateSettings(MenuItem settings, RootInfo root) {
         settings.setVisible(true);
         settings.setEnabled(root.hasSettings());
     }
 
     @Override
-    void updateEject(MenuItem eject, RootInfo root) {
+    protected void updateEject(MenuItem eject, RootInfo root) {
         eject.setVisible(true);
         eject.setEnabled(root.supportsEject() && !root.ejecting);
     }
 
     @Override
-    void updateSettings(MenuItem settings, DirectoryDetails directoryDetails) {
+    protected void updateSettings(MenuItem settings, DirectoryDetails directoryDetails) {
         settings.setVisible(directoryDetails.hasRootSettings());
     }
 
     @Override
-    void updateNewWindow(MenuItem newWindow, DirectoryDetails directoryDetails) {
+    protected void updateNewWindow(MenuItem newWindow, DirectoryDetails directoryDetails) {
         newWindow.setVisible(directoryDetails.shouldShowFancyFeatures());
     }
 
     @Override
-    void updateOpenInContextMenu(MenuItem open, SelectionDetails selectionDetails) {
+    protected void updateOpenInContextMenu(MenuItem open, SelectionDetails selectionDetails) {
         open.setEnabled(selectionDetails.size() == 1
                 && !selectionDetails.containsPartialFiles());
     }
 
     @Override
-    void updateOpenWith(MenuItem openWith, SelectionDetails selectionDetails) {
+    protected void updateOpenWith(MenuItem openWith, SelectionDetails selectionDetails) {
         openWith.setEnabled(selectionDetails.size() == 1
                 && !selectionDetails.containsPartialFiles());
     }
 
     @Override
-    void updateOpenInNewWindow(MenuItem openInNewWindow, SelectionDetails selectionDetails) {
+    protected void updateOpenInNewWindow(
+            MenuItem openInNewWindow, SelectionDetails selectionDetails) {
         openInNewWindow.setEnabled(selectionDetails.size() == 1
             && !selectionDetails.containsPartialFiles());
     }
 
     @Override
-    void updateMoveTo(MenuItem moveTo, SelectionDetails selectionDetails) {
+    protected void updateMoveTo(MenuItem moveTo, SelectionDetails selectionDetails) {
         moveTo.setVisible(true);
         moveTo.setEnabled(!selectionDetails.containsPartialFiles() && selectionDetails.canDelete());
     }
 
     @Override
-    void updateCopyTo(MenuItem copyTo, SelectionDetails selectionDetails) {
+    protected void updateCopyTo(MenuItem copyTo, SelectionDetails selectionDetails) {
         copyTo.setVisible(true);
         copyTo.setEnabled(!selectionDetails.containsPartialFiles());
     }
 
     @Override
-    void updatePasteInto(MenuItem pasteInto, SelectionDetails selectionDetails) {
+    protected void updatePasteInto(MenuItem pasteInto, SelectionDetails selectionDetails) {
         pasteInto.setEnabled(selectionDetails.canPasteInto());
     }
 
     @Override
-    void updateSelectAll(MenuItem selectAll) {
+    protected void updateSelectAll(MenuItem selectAll) {
         selectAll.setVisible(true);
     }
 
     @Override
-    void updateCreateDir(MenuItem createDir, DirectoryDetails directoryDetails) {
+    protected void updateCreateDir(MenuItem createDir, DirectoryDetails directoryDetails) {
         createDir.setVisible(true);
         createDir.setEnabled(directoryDetails.canCreateDirectory());
     }
 
     @Override
-    void updateShare(MenuItem share, SelectionDetails selectionDetails) {
+    protected void updateShare(MenuItem share, SelectionDetails selectionDetails) {
         share.setVisible(!selectionDetails.containsDirectories()
                 && !selectionDetails.containsPartialFiles());
     }
 
     @Override
-    void updateDelete(MenuItem delete, SelectionDetails selectionDetails) {
+    protected void updateDelete(MenuItem delete, SelectionDetails selectionDetails) {
         delete.setVisible(selectionDetails.canDelete());
     }
 
     @Override
-    void updateRename(MenuItem rename, SelectionDetails selectionDetails) {
+    protected void updateRename(MenuItem rename, SelectionDetails selectionDetails) {
         rename.setVisible(true);
         rename.setEnabled(!selectionDetails.containsPartialFiles() && selectionDetails.canRename());
     }
diff --git a/src/com/android/documentsui/DocumentsMenuManager.java b/src/com/android/documentsui/picker/MenuManager.java
similarity index 78%
rename from src/com/android/documentsui/DocumentsMenuManager.java
rename to src/com/android/documentsui/picker/MenuManager.java
index 4104a2c..5385482 100644
--- a/src/com/android/documentsui/DocumentsMenuManager.java
+++ b/src/com/android/documentsui/picker/MenuManager.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.documentsui;
+package com.android.documentsui.picker;
 
 import static com.android.documentsui.base.State.ACTION_CREATE;
 import static com.android.documentsui.base.State.ACTION_GET_CONTENT;
@@ -25,13 +25,14 @@
 import android.view.Menu;
 import android.view.MenuItem;
 
+import com.android.documentsui.SearchViewManager;
 import com.android.documentsui.base.State;
 
-public final class DocumentsMenuManager extends MenuManager {
+public final class MenuManager extends com.android.documentsui.MenuManager {
 
     private boolean mPicking;
 
-    public DocumentsMenuManager(SearchViewManager searchManager, State displayState) {
+    public MenuManager(SearchViewManager searchManager, State displayState) {
         super(searchManager, displayState);
 
         mPicking = mState.action == ACTION_CREATE
@@ -50,7 +51,8 @@
     }
 
     @Override
-    void updateModePicker(MenuItem grid, MenuItem list, DirectoryDetails directoryDetails) {
+    protected void updateModePicker(
+            MenuItem grid, MenuItem list, DirectoryDetails directoryDetails) {
         // No display options in recent directories
         if (mPicking && directoryDetails.isInRecents()) {
             grid.setVisible(false);
@@ -61,23 +63,23 @@
     }
 
     @Override
-    void updateSelectAll(MenuItem selectAll) {
+    protected void updateSelectAll(MenuItem selectAll) {
         selectAll.setVisible(mState.allowMultiple);
     }
 
     @Override
-    void updateCreateDir(MenuItem createDir, DirectoryDetails directoryDetails) {
+    protected void updateCreateDir(MenuItem createDir, DirectoryDetails directoryDetails) {
         createDir.setVisible(mPicking);
         createDir.setEnabled(mPicking && directoryDetails.canCreateDirectory());
     }
 
     @Override
-    void updateOpenInActionMode(MenuItem open, SelectionDetails selectionDetails) {
+    protected void updateOpenInActionMode(MenuItem open, SelectionDetails selectionDetails) {
         updateOpen(open, selectionDetails);
     }
 
     @Override
-    void updateOpenInContextMenu(MenuItem open, SelectionDetails selectionDetails) {
+    protected void updateOpenInContextMenu(MenuItem open, SelectionDetails selectionDetails) {
         updateOpen(open, selectionDetails);
     }
 
diff --git a/src/com/android/documentsui/picker/PickActivity.java b/src/com/android/documentsui/picker/PickActivity.java
index dbe722f..9f738c8 100644
--- a/src/com/android/documentsui/picker/PickActivity.java
+++ b/src/com/android/documentsui/picker/PickActivity.java
@@ -43,8 +43,6 @@
 
 import com.android.documentsui.BaseActivity;
 import com.android.documentsui.DocumentsApplication;
-import com.android.documentsui.DocumentsMenuManager;
-import com.android.documentsui.MenuManager;
 import com.android.documentsui.MenuManager.DirectoryDetails;
 import com.android.documentsui.base.DocumentInfo;
 import com.android.documentsui.base.MimePredicate;
@@ -68,7 +66,7 @@
 public class PickActivity extends BaseActivity {
     private static final int CODE_FORWARD = 42;
     private static final String TAG = "DocumentsActivity";
-    private DocumentsMenuManager mMenuManager;
+    private MenuManager mMenuManager;
     private DirectoryDetails mDetails;
 
     public PickActivity() {
@@ -78,7 +76,7 @@
     @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
-        mMenuManager = new DocumentsMenuManager(mSearchManager, getDisplayState());
+        mMenuManager = new MenuManager(mSearchManager, getDisplayState());
         mDetails = new DirectoryDetails(this);
 
         if (mState.action == ACTION_CREATE) {
diff --git a/tests/common/com/android/documentsui/testing/TestSearchViewManager.java b/tests/common/com/android/documentsui/testing/TestSearchViewManager.java
index a8d4ce0..76319c3 100644
--- a/tests/common/com/android/documentsui/testing/TestSearchViewManager.java
+++ b/tests/common/com/android/documentsui/testing/TestSearchViewManager.java
@@ -42,7 +42,7 @@
     }
 
     @Override
-    protected void showMenu(boolean visible) {
+    public void showMenu(boolean visible) {
         showMenuCalled = true;
     }
 
diff --git a/tests/functional/com/android/documentsui/RenameDocumentUiTest.java b/tests/functional/com/android/documentsui/RenameDocumentUiTest.java
index 5ed4d79..b70477d 100644
--- a/tests/functional/com/android/documentsui/RenameDocumentUiTest.java
+++ b/tests/functional/com/android/documentsui/RenameDocumentUiTest.java
@@ -18,8 +18,8 @@
 
 import android.support.test.uiautomator.UiObjectNotFoundException;
 import android.test.suitebuilder.annotation.LargeTest;
+
 import com.android.documentsui.R;
-import com.android.documentsui.R.string;
 import com.android.documentsui.manager.ManageActivity;
 
 @LargeTest
@@ -38,7 +38,6 @@
         bots.roots.closeDrawer();
     }
 
-    // TODO: Move this over to the FilesMenuManagerTest.
     public void testRenameEnabled_SingleSelection() throws Exception {
         bots.directory.selectDocument(fileName1, 1);
         bots.main.openOverflowMenu();
@@ -48,7 +47,6 @@
         device.pressBack();
     }
 
-    // TODO: Move this over to the FilesMenuManagerTest.
     public void testNoRenameSupport_SingleSelection() throws Exception {
         bots.directory.selectDocument(fileNameNoRename, 1);
         bots.main.openOverflowMenu();
@@ -58,7 +56,6 @@
         device.pressBack();
     }
 
-    // TODO: Move this over to the FilesMenuManagerTest.
     public void testOneHasRenameSupport_MultipleSelection() throws Exception {
         bots.directory.selectDocument(fileName1, 1);
         bots.directory.selectDocument(fileNameNoRename, 2);
@@ -69,7 +66,6 @@
         device.pressBack();
     }
 
-    // TODO: Move this over to the FilesMenuManagerTest.
     public void testRenameDisabled_MultipleSelection() throws Exception {
         bots.directory.selectDocument(fileName1, 1);
         bots.directory.selectDocument(fileName2, 2);
diff --git a/tests/unit/com/android/documentsui/FilesMenuManagerTest.java b/tests/unit/com/android/documentsui/manager/MenuManagerTest.java
similarity index 75%
rename from tests/unit/com/android/documentsui/FilesMenuManagerTest.java
rename to tests/unit/com/android/documentsui/manager/MenuManagerTest.java
index bd131a0..9565b9c 100644
--- a/tests/unit/com/android/documentsui/FilesMenuManagerTest.java
+++ b/tests/unit/com/android/documentsui/manager/MenuManagerTest.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.documentsui;
+package com.android.documentsui.manager;
 
 import static junit.framework.Assert.assertEquals;
 
@@ -24,6 +24,7 @@
 import android.support.test.filters.SmallTest;
 import android.support.test.runner.AndroidJUnit4;
 
+import com.android.documentsui.R;
 import com.android.documentsui.base.RootInfo;
 import com.android.documentsui.base.State;
 import com.android.documentsui.testing.TestDirectoryDetails;
@@ -37,10 +38,9 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
-
 @RunWith(AndroidJUnit4.class)
 @SmallTest
-public final class FilesMenuManagerTest {
+public final class MenuManagerTest {
 
     private TestMenu testMenu;
     private TestMenuItem rename;
@@ -104,7 +104,7 @@
         selectionDetails.canDelete = true;
         selectionDetails.canRename = true;
 
-        FilesMenuManager mgr = new FilesMenuManager(testSearchManager, state);
+        MenuManager mgr = new MenuManager(testSearchManager, state);
         mgr.updateActionMenu(testMenu, selectionDetails);
 
         rename.assertEnabled();
@@ -117,7 +117,7 @@
     @Test
     public void testActionMenu_containsPartial() {
         selectionDetails.containPartial = true;
-        FilesMenuManager mgr = new FilesMenuManager(testSearchManager, state);
+        MenuManager mgr = new MenuManager(testSearchManager, state);
         mgr.updateActionMenu(testMenu, selectionDetails);
 
         rename.assertDisabled();
@@ -129,7 +129,7 @@
     @Test
     public void testActionMenu_cantRename() {
         selectionDetails.canRename = false;
-        FilesMenuManager mgr = new FilesMenuManager(testSearchManager, state);
+        MenuManager mgr = new MenuManager(testSearchManager, state);
         mgr.updateActionMenu(testMenu, selectionDetails);
 
         rename.assertDisabled();
@@ -138,7 +138,7 @@
     @Test
     public void testActionMenu_cantDelete() {
         selectionDetails.canDelete = false;
-        FilesMenuManager mgr = new FilesMenuManager(testSearchManager, state);
+        MenuManager mgr = new MenuManager(testSearchManager, state);
         mgr.updateActionMenu(testMenu, selectionDetails);
 
         delete.assertInvisible();
@@ -149,7 +149,7 @@
     @Test
     public void testActionMenu_containsDirectory() {
         selectionDetails.containDirectories = true;
-        FilesMenuManager mgr = new FilesMenuManager(testSearchManager, state);
+        MenuManager mgr = new MenuManager(testSearchManager, state);
         mgr.updateActionMenu(testMenu, selectionDetails);
 
         // We can't share directories
@@ -158,7 +158,7 @@
 
     @Test
     public void testOptionMenu() {
-        FilesMenuManager mgr = new FilesMenuManager(testSearchManager, state);
+        MenuManager mgr = new MenuManager(testSearchManager, state);
         mgr.updateOptionMenu(testMenu, directoryDetails);
 
         advanced.assertInvisible();
@@ -171,7 +171,7 @@
     public void testOptionMenu_showAdvanced() {
         state.showAdvanced = true;
         state.showAdvancedOption = true;
-        FilesMenuManager mgr = new FilesMenuManager(testSearchManager, state);
+        MenuManager mgr = new MenuManager(testSearchManager, state);
         mgr.updateOptionMenu(testMenu, directoryDetails);
 
         advanced.assertVisible();
@@ -181,7 +181,7 @@
     @Test
     public void testOptionMenu_canCreateDirectory() {
         directoryDetails.canCreateDirectory = true;
-        FilesMenuManager mgr = new FilesMenuManager(testSearchManager, state);
+        MenuManager mgr = new MenuManager(testSearchManager, state);
         mgr.updateOptionMenu(testMenu, directoryDetails);
 
         createDir.assertEnabled();
@@ -190,7 +190,7 @@
     @Test
     public void testOptionMenu_hasRootSettings() {
         directoryDetails.hasRootSettings = true;
-        FilesMenuManager mgr = new FilesMenuManager(testSearchManager, state);
+        MenuManager mgr = new MenuManager(testSearchManager, state);
         mgr.updateOptionMenu(testMenu, directoryDetails);
 
         settings.assertVisible();
@@ -199,7 +199,7 @@
     @Test
     public void testOptionMenu_shouldShowFancyFeatures() {
         directoryDetails.shouldShowFancyFeatures = true;
-        FilesMenuManager mgr = new FilesMenuManager(testSearchManager, state);
+        MenuManager mgr = new MenuManager(testSearchManager, state);
         mgr.updateOptionMenu(testMenu, directoryDetails);
 
         newWindow.assertVisible();
@@ -208,7 +208,7 @@
     @Test
     public void testInflateContextMenu_Files() {
         TestMenuInflater inflater = new TestMenuInflater();
-        FilesMenuManager mgr = new FilesMenuManager(testSearchManager, state);
+        MenuManager mgr = new MenuManager(testSearchManager, state);
 
         selectionDetails.containFiles = true;
         selectionDetails.containDirectories = false;
@@ -220,7 +220,7 @@
     @Test
     public void testInflateContextMenu_Dirs() {
         TestMenuInflater inflater = new TestMenuInflater();
-        FilesMenuManager mgr = new FilesMenuManager(testSearchManager, state);
+        MenuManager mgr = new MenuManager(testSearchManager, state);
 
         selectionDetails.containFiles = false;
         selectionDetails.containDirectories = true;
@@ -232,7 +232,7 @@
     @Test
     public void testInflateContextMenu_Mixed() {
         TestMenuInflater inflater = new TestMenuInflater();
-        FilesMenuManager mgr = new FilesMenuManager(testSearchManager, state);
+        MenuManager mgr = new MenuManager(testSearchManager, state);
 
         selectionDetails.containFiles = true;
         selectionDetails.containDirectories = true;
@@ -243,7 +243,7 @@
 
     @Test
     public void testContextMenu_EmptyArea() {
-        FilesMenuManager mgr = new FilesMenuManager(testSearchManager, state);
+        MenuManager mgr = new MenuManager(testSearchManager, state);
         mgr.updateContextMenuForContainer(testMenu, directoryDetails);
 
         selectAll.assertVisible();
@@ -254,7 +254,7 @@
     @Test
     public void testContextMenu_OnFile() {
         selectionDetails.size = 1;
-        FilesMenuManager mgr = new FilesMenuManager(testSearchManager, state);
+        MenuManager mgr = new MenuManager(testSearchManager, state);
         mgr.updateContextMenuForFiles(testMenu, selectionDetails);
         open.assertVisible();
         open.assertEnabled();
@@ -269,7 +269,7 @@
 
     @Test
     public void testContextMenu_OnMultipleFiles() {
-        FilesMenuManager mgr = new FilesMenuManager(testSearchManager, state);
+        MenuManager mgr = new MenuManager(testSearchManager, state);
         selectionDetails.size = 3;
         mgr.updateContextMenuForFiles(testMenu, selectionDetails);
         open.assertVisible();
@@ -280,7 +280,7 @@
 
     @Test
     public void testContextMenu_OnWritableDirectory() {
-        FilesMenuManager mgr = new FilesMenuManager(testSearchManager, state);
+        MenuManager mgr = new MenuManager(testSearchManager, state);
         selectionDetails.size = 1;
         selectionDetails.canPasteInto = true;
         mgr.updateContextMenuForDirs(testMenu, selectionDetails);
@@ -296,7 +296,7 @@
 
     @Test
     public void testContextMenu_OnNonWritableDirectory() {
-        FilesMenuManager mgr = new FilesMenuManager(testSearchManager, state);
+        com.android.documentsui.manager.MenuManager mgr = new MenuManager(testSearchManager, state);
         selectionDetails.size = 1;
         selectionDetails.canPasteInto = false;
         mgr.updateContextMenuForDirs(testMenu, selectionDetails);
@@ -312,7 +312,7 @@
 
     @Test
     public void testContextMenu_OnMultipleDirectories() {
-        FilesMenuManager mgr = new FilesMenuManager(testSearchManager, state);
+        MenuManager mgr = new MenuManager(testSearchManager, state);
         selectionDetails.size = 3;
         mgr.updateContextMenuForDirs(testMenu, selectionDetails);
         openInNewWindow.assertVisible();
@@ -320,8 +320,57 @@
     }
 
     @Test
+    public void testContextMenu_OnMixedDocs() {
+        MenuManager mgr = new MenuManager(testSearchManager, state);
+        selectionDetails.containDirectories = true;
+        selectionDetails.containFiles = true;
+        selectionDetails.size = 2;
+        selectionDetails.canDelete = true;
+        mgr.updateContextMenu(testMenu, selectionDetails);
+        cut.assertVisible();
+        cut.assertEnabled();
+        copy.assertVisible();
+        copy.assertEnabled();
+        delete.assertVisible();
+        delete.assertEnabled();
+    }
+
+    @Test
+    public void testContextMenu_OnMixedDocs_hasPartialFile() {
+        MenuManager mgr = new MenuManager(testSearchManager, state);
+        selectionDetails.containDirectories = true;
+        selectionDetails.containFiles = true;
+        selectionDetails.size = 2;
+        selectionDetails.containPartial = true;
+        selectionDetails.canDelete = true;
+        mgr.updateContextMenu(testMenu, selectionDetails);
+        cut.assertVisible();
+        cut.assertDisabled();
+        copy.assertVisible();
+        copy.assertDisabled();
+        delete.assertVisible();
+        delete.assertEnabled();
+    }
+
+    @Test
+    public void testContextMenu_OnMixedDocs_hasUndeletableFile() {
+        MenuManager mgr = new MenuManager(testSearchManager, state);
+        selectionDetails.containDirectories = true;
+        selectionDetails.containFiles = true;
+        selectionDetails.size = 2;
+        selectionDetails.canDelete = false;
+        mgr.updateContextMenu(testMenu, selectionDetails);
+        cut.assertVisible();
+        cut.assertDisabled();
+        copy.assertVisible();
+        copy.assertEnabled();
+        delete.assertVisible();
+        delete.assertDisabled();
+    }
+
+    @Test
     public void testRootContextMenu() {
-        FilesMenuManager mgr = new FilesMenuManager(testSearchManager, state);
+        MenuManager mgr = new MenuManager(testSearchManager, state);
         mgr.updateRootContextMenu(testMenu, testRootInfo);
 
         eject.assertVisible();
@@ -334,7 +383,7 @@
     @Test
     public void testRootContextMenu_hasRootSettings() {
         testRootInfo.flags = Root.FLAG_HAS_SETTINGS;
-        FilesMenuManager mgr = new FilesMenuManager(testSearchManager, state);
+        MenuManager mgr = new MenuManager(testSearchManager, state);
         mgr.updateRootContextMenu(testMenu, testRootInfo);
 
         settings.assertEnabled();
@@ -343,7 +392,7 @@
     @Test
     public void testRootContextMenu_eject() {
         testRootInfo.flags = Root.FLAG_SUPPORTS_EJECT;
-        FilesMenuManager mgr = new FilesMenuManager(testSearchManager, state);
+        MenuManager mgr = new MenuManager(testSearchManager, state);
         mgr.updateRootContextMenu(testMenu, testRootInfo);
 
         eject.assertEnabled();
@@ -353,7 +402,7 @@
     public void testRootContextMenu_ejectInProcess() {
         testRootInfo.flags = Root.FLAG_SUPPORTS_EJECT;
         testRootInfo.ejecting = true;
-        FilesMenuManager mgr = new FilesMenuManager(testSearchManager, state);
+        MenuManager mgr = new MenuManager(testSearchManager, state);
         mgr.updateRootContextMenu(testMenu, testRootInfo);
 
         eject.assertDisabled();
diff --git a/tests/unit/com/android/documentsui/DocumentsMenuManagerTest.java b/tests/unit/com/android/documentsui/picker/MenuManagerTest.java
similarity index 73%
rename from tests/unit/com/android/documentsui/DocumentsMenuManagerTest.java
rename to tests/unit/com/android/documentsui/picker/MenuManagerTest.java
index ad79062..7a0eec7 100644
--- a/tests/unit/com/android/documentsui/DocumentsMenuManagerTest.java
+++ b/tests/unit/com/android/documentsui/picker/MenuManagerTest.java
@@ -14,10 +14,11 @@
  * limitations under the License.
  */
 
-package com.android.documentsui;
+package com.android.documentsui.picker;
 
 import static com.android.documentsui.base.State.ACTION_CREATE;
 import static com.android.documentsui.base.State.ACTION_OPEN;
+
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
@@ -25,6 +26,7 @@
 import android.support.test.filters.SmallTest;
 import android.support.test.runner.AndroidJUnit4;
 
+import com.android.documentsui.R;
 import com.android.documentsui.base.RootInfo;
 import com.android.documentsui.base.State;
 import com.android.documentsui.testing.TestDirectoryDetails;
@@ -39,7 +41,7 @@
 
 @RunWith(AndroidJUnit4.class)
 @SmallTest
-public final class DocumentsMenuManagerTest {
+public final class MenuManagerTest {
 
     private TestMenu testMenu;
     private TestMenuItem open;
@@ -98,7 +100,7 @@
 
     @Test
     public void testActionMenu() {
-        DocumentsMenuManager mgr = new DocumentsMenuManager(testSearchManager, state);
+        MenuManager mgr = new MenuManager(testSearchManager, state);
         mgr.updateActionMenu(testMenu, selectionDetails);
 
         open.assertInvisible();
@@ -111,7 +113,7 @@
     @Test
     public void testActionMenu_openAction() {
         state.action = ACTION_OPEN;
-        DocumentsMenuManager mgr = new DocumentsMenuManager(testSearchManager, state);
+        MenuManager mgr = new MenuManager(testSearchManager, state);
         mgr.updateActionMenu(testMenu, selectionDetails);
 
         open.assertVisible();
@@ -121,7 +123,7 @@
     @Test
     public void testActionMenu_notAllowMultiple() {
         state.allowMultiple = false;
-        DocumentsMenuManager mgr = new DocumentsMenuManager(testSearchManager, state);
+        MenuManager mgr = new MenuManager(testSearchManager, state);
         mgr.updateActionMenu(testMenu, selectionDetails);
 
         selectAll.assertInvisible();
@@ -129,7 +131,7 @@
 
     @Test
     public void testOptionMenu() {
-        DocumentsMenuManager mgr = new DocumentsMenuManager(testSearchManager, state);
+        MenuManager mgr = new MenuManager(testSearchManager, state);
         mgr.updateOptionMenu(testMenu, directoryDetails);
 
         advanced.assertInvisible();
@@ -142,7 +144,7 @@
     public void testOptionMenu_notPicking() {
         state.action = ACTION_OPEN;
         state.derivedMode = State.MODE_LIST;
-        DocumentsMenuManager mgr = new DocumentsMenuManager(testSearchManager, state);
+        MenuManager mgr = new MenuManager(testSearchManager, state);
         mgr.updateOptionMenu(testMenu, directoryDetails);
 
         createDir.assertInvisible();
@@ -153,7 +155,7 @@
 
     @Test
     public void testOptionMenu_canCreateDirectory() {
-        DocumentsMenuManager mgr = new DocumentsMenuManager(testSearchManager, state);
+        MenuManager mgr = new MenuManager(testSearchManager, state);
         directoryDetails.canCreateDirectory = true;
         mgr.updateOptionMenu(testMenu, directoryDetails);
 
@@ -164,7 +166,7 @@
     public void testOptionMenu_showAdvanced() {
         state.showAdvanced = true;
         state.showAdvancedOption = true;
-        DocumentsMenuManager mgr = new DocumentsMenuManager(testSearchManager, state);
+        MenuManager mgr = new MenuManager(testSearchManager, state);
         mgr.updateOptionMenu(testMenu, directoryDetails);
 
         advanced.assertVisible();
@@ -173,7 +175,7 @@
 
     @Test
     public void testOptionMenu_inRecents() {
-        DocumentsMenuManager mgr = new DocumentsMenuManager(testSearchManager, state);
+        MenuManager mgr = new MenuManager(testSearchManager, state);
         directoryDetails.isInRecents = true;
         mgr.updateOptionMenu(testMenu, directoryDetails);
 
@@ -183,7 +185,7 @@
 
     @Test
     public void testContextMenu_EmptyArea() {
-        DocumentsMenuManager mgr = new DocumentsMenuManager(testSearchManager, state);
+        MenuManager mgr = new MenuManager(testSearchManager, state);
         mgr.updateContextMenuForContainer(testMenu, directoryDetails);
         selectAll.assertVisible();
         paste.assertVisible();
@@ -192,7 +194,7 @@
 
     @Test
     public void testContextMenu_OnFile() {
-        DocumentsMenuManager mgr = new DocumentsMenuManager(testSearchManager, state);
+        MenuManager mgr = new MenuManager(testSearchManager, state);
         mgr.updateContextMenuForFiles(testMenu, selectionDetails);
         // We don't want share in pickers.
         share.assertInvisible();
@@ -206,7 +208,7 @@
 
     @Test
     public void testContextMenu_OnDirectory() {
-        DocumentsMenuManager mgr = new DocumentsMenuManager(testSearchManager, state);
+        MenuManager mgr = new MenuManager(testSearchManager, state);
         selectionDetails.canPasteInto = true;
         mgr.updateContextMenuForDirs(testMenu, selectionDetails);
         // We don't want openInNewWindow in pickers
@@ -220,8 +222,54 @@
     }
 
     @Test
+    public void testContextMenu_OnMixedDocs() {
+        MenuManager mgr = new MenuManager(testSearchManager, state);
+        selectionDetails.containDirectories = true;
+        selectionDetails.containFiles = true;
+        selectionDetails.size = 2;
+        selectionDetails.canDelete = true;
+        mgr.updateContextMenu(testMenu, selectionDetails);
+        cut.assertVisible();
+        copy.assertVisible();
+        delete.assertVisible();
+    }
+
+    @Test
+    public void testContextMenu_OnMixedDocs_hasPartialFile() {
+        MenuManager mgr = new MenuManager(testSearchManager, state);
+        selectionDetails.containDirectories = true;
+        selectionDetails.containFiles = true;
+        selectionDetails.size = 2;
+        selectionDetails.containPartial = true;
+        selectionDetails.canDelete = true;
+        mgr.updateContextMenu(testMenu, selectionDetails);
+        cut.assertVisible();
+        cut.assertDisabled();
+        copy.assertVisible();
+        copy.assertDisabled();
+        delete.assertVisible();
+        delete.assertEnabled();
+    }
+
+    @Test
+    public void testContextMenu_OnMixedDocs_hasUndeletableFile() {
+        MenuManager mgr = new MenuManager(testSearchManager, state);
+        selectionDetails.containDirectories = true;
+        selectionDetails.containFiles = true;
+        selectionDetails.size = 2;
+        selectionDetails.canDelete = false;
+        mgr.updateContextMenu(testMenu, selectionDetails);
+        cut.assertVisible();
+        cut.assertDisabled();
+        copy.assertVisible();
+        copy.assertEnabled();
+        delete.assertVisible();
+        delete.assertDisabled();
+    }
+
+    @Test
     public void testRootContextMenu() {
-        DocumentsMenuManager mgr = new DocumentsMenuManager(testSearchManager, state);
+        MenuManager mgr = new MenuManager(testSearchManager, state);
         mgr.updateRootContextMenu(testMenu, testRootInfo);
 
         eject.assertInvisible();
@@ -230,7 +278,7 @@
 
     @Test
     public void testRootContextMenu_hasRootSettings() {
-        DocumentsMenuManager mgr = new DocumentsMenuManager(testSearchManager, state);
+        MenuManager mgr = new MenuManager(testSearchManager, state);
         testRootInfo.flags = Root.FLAG_HAS_SETTINGS;
         mgr.updateRootContextMenu(testMenu, testRootInfo);
 
@@ -239,7 +287,7 @@
 
     @Test
     public void testRootContextMenu_canEject() {
-        DocumentsMenuManager mgr = new DocumentsMenuManager(testSearchManager, state);
+        MenuManager mgr = new MenuManager(testSearchManager, state);
         testRootInfo.flags = Root.FLAG_SUPPORTS_EJECT;
         mgr.updateRootContextMenu(testMenu, testRootInfo);