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) {