diff --git a/src/com/android/documentsui/BaseActivity.java b/src/com/android/documentsui/BaseActivity.java
index d41c521..c96d605 100644
--- a/src/com/android/documentsui/BaseActivity.java
+++ b/src/com/android/documentsui/BaseActivity.java
@@ -152,12 +152,6 @@
      */
     public abstract MenuManager getMenuManager();
 
-    /**
-     * Provides Activity a means of injection into and specialization of
-     * DirectoryFragment.
-     */
-    public abstract DirectoryDetails getDirectoryDetails();
-
     public abstract void onDocumentPicked(DocumentInfo doc, Model model);
     public abstract void onDocumentsPicked(List<DocumentInfo> docs);
 
diff --git a/src/com/android/documentsui/MenuManager.java b/src/com/android/documentsui/MenuManager.java
index 55dffb1..ac45c16 100644
--- a/src/com/android/documentsui/MenuManager.java
+++ b/src/com/android/documentsui/MenuManager.java
@@ -31,12 +31,17 @@
 
 public abstract class MenuManager {
 
-    final protected State mState;
     final protected SearchViewManager mSearchManager;
+    final protected State mState;
+    final protected DirectoryDetails mDirDetails;
 
-    public MenuManager(SearchViewManager searchManager, State displayState) {
+    public MenuManager(
+            SearchViewManager searchManager,
+            State displayState,
+            DirectoryDetails dirDetails) {
         mSearchManager = searchManager;
         mState = displayState;
+        mDirDetails = dirDetails;
     }
 
     /** @see ActionModeController */
@@ -53,14 +58,13 @@
     }
 
     /** @see BaseActivity#onPrepareOptionsMenu */
-    public void updateOptionMenu(Menu menu, DirectoryDetails directoryDetails) {
-        updateCreateDir(menu.findItem(R.id.menu_create_dir), directoryDetails);
-        updateSettings(menu.findItem(R.id.menu_settings), directoryDetails);
-        updateNewWindow(menu.findItem(R.id.menu_new_window), directoryDetails);
-        updateModePicker(menu.findItem(
-                R.id.menu_grid), menu.findItem(R.id.menu_list), directoryDetails);
+    public void updateOptionMenu(Menu menu) {
+        updateCreateDir(menu.findItem(R.id.menu_create_dir));
+        updateSettings(menu.findItem(R.id.menu_settings));
+        updateNewWindow(menu.findItem(R.id.menu_new_window));
+        updateModePicker(menu.findItem(R.id.menu_grid), menu.findItem(R.id.menu_list));
         // Sort menu item is managed by SortMenuManager
-        updateAdvanced(menu.findItem(R.id.menu_advanced), directoryDetails);
+        updateAdvanced(menu.findItem(R.id.menu_advanced));
 
         Menus.disableHiddenItems(menu);
     }
@@ -77,8 +81,7 @@
         // Pickers don't have any context menu at this moment.
     }
 
-    public void inflateContextMenuForContainer(
-            Menu menu, MenuInflater inflater, DirectoryDetails directoryDetails) {
+    public void inflateContextMenuForContainer(Menu menu, MenuInflater inflater) {
         throw new UnsupportedOperationException("Pickers don't allow context menu.");
     }
 
@@ -166,11 +169,11 @@
      * Called when user tries to generate a context menu anchored to an empty pane.
      */
     @VisibleForTesting
-    public void updateContextMenuForContainer(Menu menu, DirectoryDetails directoryDetails) {
+    public void updateContextMenuForContainer(Menu menu) {
         MenuItem paste = menu.findItem(R.id.menu_paste_from_clipboard);
         MenuItem selectAll = menu.findItem(R.id.menu_select_all);
 
-        paste.setEnabled(directoryDetails.hasItemsToPaste() && directoryDetails.canCreateDoc());
+        paste.setEnabled(mDirDetails.hasItemsToPaste() && mDirDetails.canCreateDoc());
         updateSelectAll(selectAll);
     }
 
@@ -185,19 +188,18 @@
         updateEject(eject, root);
     }
 
-    protected void updateModePicker(
-            MenuItem grid, MenuItem list, DirectoryDetails directoryDetails) {
+    protected void updateModePicker(MenuItem grid, MenuItem list) {
         grid.setVisible(mState.derivedMode != State.MODE_GRID);
         list.setVisible(mState.derivedMode != State.MODE_LIST);
     }
 
-    protected void updateAdvanced(MenuItem advanced, DirectoryDetails directoryDetails) {
+    protected void updateAdvanced(MenuItem advanced) {
         advanced.setVisible(mState.showAdvancedOption);
         advanced.setTitle(mState.showAdvancedOption && mState.showAdvanced
                 ? R.string.menu_advanced_hide : R.string.menu_advanced_show);
     }
 
-    protected void updateSettings(MenuItem settings, DirectoryDetails directoryDetails) {
+    protected void updateSettings(MenuItem settings) {
         settings.setVisible(false);
     }
 
@@ -209,7 +211,7 @@
         eject.setVisible(false);
     }
 
-    protected void updateNewWindow(MenuItem newWindow, DirectoryDetails directoryDetails) {
+    protected void updateNewWindow(MenuItem newWindow) {
         newWindow.setVisible(false);
     }
 
@@ -253,7 +255,7 @@
     protected abstract void updateOpenInContextMenu(
             MenuItem open, SelectionDetails selectionDetails);
     protected abstract void updateSelectAll(MenuItem selectAll);
-    protected abstract void updateCreateDir(MenuItem createDir, DirectoryDetails directoryDetails);
+    protected abstract void updateCreateDir(MenuItem createDir);
 
     /**
      * Access to meta data about the selection.
diff --git a/src/com/android/documentsui/dirlist/DirectoryFragment.java b/src/com/android/documentsui/dirlist/DirectoryFragment.java
index bcd1f30..997fc8a 100644
--- a/src/com/android/documentsui/dirlist/DirectoryFragment.java
+++ b/src/com/android/documentsui/dirlist/DirectoryFragment.java
@@ -448,8 +448,7 @@
             // TODO: inject DirectoryDetails into MenuManager constructor
             // Since both classes are supplied by Activity and created
             // at the same time.
-            mMenuManager.inflateContextMenuForContainer(
-                    menu, inflater, getBaseActivity().getDirectoryDetails());
+            mMenuManager.inflateContextMenuForContainer(menu, inflater);
         } else {
             mMenuManager.inflateContextMenuForDocs(menu, inflater, mSelectionMetadata);
         }
diff --git a/src/com/android/documentsui/manager/ManageActivity.java b/src/com/android/documentsui/manager/ManageActivity.java
index 0b4c982..77ff743 100644
--- a/src/com/android/documentsui/manager/ManageActivity.java
+++ b/src/com/android/documentsui/manager/ManageActivity.java
@@ -81,7 +81,6 @@
     private long mDrawerLastFiddled;
     private Tuner mTuner;
     private MenuManager mMenuManager;
-    private DirectoryDetails mDetails;
     private DocumentClipper mClipper;
 
     public ManageActivity() {
@@ -93,14 +92,16 @@
         super.onCreate(icicle);
 
         mClipper = DocumentsApplication.getDocumentClipper(this);
-        mMenuManager = new MenuManager(mSearchManager, mState);
+        mMenuManager = new MenuManager(
+                mSearchManager,
+                mState,
+                new DirectoryDetails(this) {
+                    @Override
+                    public boolean hasItemsToPaste() {
+                        return mClipper.hasItemsToPaste();
+                    }
+                });
         mTuner = new Tuner(this, mState);
-        mDetails = new DirectoryDetails(this) {
-            @Override
-            public boolean hasItemsToPaste() {
-                return mClipper.hasItemsToPaste();
-            }
-        };
         mClipper = DocumentsApplication.getDocumentClipper(this);
 
         RootsFragment.show(getFragmentManager(), this::openRootSettings);
@@ -223,7 +224,7 @@
     @Override
     public boolean onPrepareOptionsMenu(Menu menu) {
         super.onPrepareOptionsMenu(menu);
-        mMenuManager.updateOptionMenu(menu, mDetails);
+        mMenuManager.updateOptionMenu(menu);
         return true;
     }
 
@@ -543,11 +544,6 @@
         return mMenuManager;
     }
 
-    @Override
-    public DirectoryDetails getDirectoryDetails() {
-        return mDetails;
-    }
-
     /**
      * Builds a stack for the specific Uris. Multi roots are not supported, as it's impossible
      * to know which root to select. Also, the stack doesn't contain intermediate directories.
diff --git a/src/com/android/documentsui/manager/MenuManager.java b/src/com/android/documentsui/manager/MenuManager.java
index 7fca108..7b611ac 100644
--- a/src/com/android/documentsui/manager/MenuManager.java
+++ b/src/com/android/documentsui/manager/MenuManager.java
@@ -29,13 +29,16 @@
 
 public final class MenuManager extends com.android.documentsui.MenuManager {
 
-    public MenuManager(SearchViewManager searchManager, State displayState) {
-        super(searchManager, displayState);
+    public MenuManager(
+            SearchViewManager searchManager,
+            State displayState,
+            DirectoryDetails dirDetails) {
+        super(searchManager, displayState, dirDetails);
     }
 
     @Override
-    public void updateOptionMenu(Menu menu, DirectoryDetails details) {
-        super.updateOptionMenu(menu, details);
+    public void updateOptionMenu(Menu menu) {
+        super.updateOptionMenu(menu);
 
         // It hides icon if searching in progress
         mSearchManager.updateMenu();
@@ -50,10 +53,9 @@
     }
 
     @Override
-    public void inflateContextMenuForContainer(
-            Menu menu, MenuInflater inflater, DirectoryDetails directoryDetails) {
+    public void inflateContextMenuForContainer(Menu menu, MenuInflater inflater) {
         inflater.inflate(R.menu.container_context_menu, menu);
-        updateContextMenuForContainer(menu, directoryDetails);
+        updateContextMenuForContainer(menu);
     }
 
     @Override
@@ -92,13 +94,13 @@
     }
 
     @Override
-    protected void updateSettings(MenuItem settings, DirectoryDetails directoryDetails) {
-        settings.setVisible(directoryDetails.hasRootSettings());
+    protected void updateSettings(MenuItem settings) {
+        settings.setVisible(mDirDetails.hasRootSettings());
     }
 
     @Override
-    protected void updateNewWindow(MenuItem newWindow, DirectoryDetails directoryDetails) {
-        newWindow.setVisible(directoryDetails.shouldShowFancyFeatures());
+    protected void updateNewWindow(MenuItem newWindow) {
+        newWindow.setVisible(mDirDetails.shouldShowFancyFeatures());
     }
 
     @Override
@@ -143,9 +145,9 @@
     }
 
     @Override
-    protected void updateCreateDir(MenuItem createDir, DirectoryDetails directoryDetails) {
+    protected void updateCreateDir(MenuItem createDir) {
         createDir.setVisible(true);
-        createDir.setEnabled(directoryDetails.canCreateDirectory());
+        createDir.setEnabled(mDirDetails.canCreateDirectory());
     }
 
     @Override
@@ -164,4 +166,4 @@
         rename.setVisible(true);
         rename.setEnabled(!selectionDetails.containsPartialFiles() && selectionDetails.canRename());
     }
-}
\ No newline at end of file
+}
diff --git a/src/com/android/documentsui/picker/MenuManager.java b/src/com/android/documentsui/picker/MenuManager.java
index 5385482..a61081b 100644
--- a/src/com/android/documentsui/picker/MenuManager.java
+++ b/src/com/android/documentsui/picker/MenuManager.java
@@ -30,20 +30,21 @@
 
 public final class MenuManager extends com.android.documentsui.MenuManager {
 
-    private boolean mPicking;
+    public MenuManager(SearchViewManager searchManager, State displayState, DirectoryDetails dirDetails) {
+        super(searchManager, displayState, dirDetails);
 
-    public MenuManager(SearchViewManager searchManager, State displayState) {
-        super(searchManager, displayState);
+    }
 
-        mPicking = mState.action == ACTION_CREATE
+    private boolean picking() {
+        return mState.action == ACTION_CREATE
                 || mState.action == ACTION_OPEN_TREE
                 || mState.action == ACTION_PICK_COPY_DESTINATION;
     }
 
     @Override
-    public void updateOptionMenu(Menu menu, DirectoryDetails details) {
-        super.updateOptionMenu(menu, details);
-        if (mPicking) {
+    public void updateOptionMenu(Menu menu) {
+        super.updateOptionMenu(menu);
+        if (picking()) {
             // May already be hidden because the root
             // doesn't support search.
             mSearchManager.showMenu(false);
@@ -51,14 +52,13 @@
     }
 
     @Override
-    protected void updateModePicker(
-            MenuItem grid, MenuItem list, DirectoryDetails directoryDetails) {
+    protected void updateModePicker(MenuItem grid, MenuItem list) {
         // No display options in recent directories
-        if (mPicking && directoryDetails.isInRecents()) {
+        if (picking() && mDirDetails.isInRecents()) {
             grid.setVisible(false);
             list.setVisible(false);
         } else {
-            super.updateModePicker(grid, list, directoryDetails);
+            super.updateModePicker(grid, list);
         }
     }
 
@@ -68,9 +68,9 @@
     }
 
     @Override
-    protected void updateCreateDir(MenuItem createDir, DirectoryDetails directoryDetails) {
-        createDir.setVisible(mPicking);
-        createDir.setEnabled(mPicking && directoryDetails.canCreateDirectory());
+    protected void updateCreateDir(MenuItem createDir) {
+        createDir.setVisible(picking());
+        createDir.setEnabled(picking() && mDirDetails.canCreateDirectory());
     }
 
     @Override
diff --git a/src/com/android/documentsui/picker/PickActivity.java b/src/com/android/documentsui/picker/PickActivity.java
index 83e446a..2e88c54 100644
--- a/src/com/android/documentsui/picker/PickActivity.java
+++ b/src/com/android/documentsui/picker/PickActivity.java
@@ -69,7 +69,6 @@
     private static final String TAG = "DocumentsActivity";
     private MenuManager mMenuManager;
     private Tuner mTuner;
-    private DirectoryDetails mDetails;
 
     public PickActivity() {
         super(R.layout.documents_activity, TAG);
@@ -79,8 +78,7 @@
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
         mTuner = new Tuner(this, mState);
-        mMenuManager = new MenuManager(mSearchManager, mState);
-        mDetails = new DirectoryDetails(this);
+        mMenuManager = new MenuManager(mSearchManager, mState, new DirectoryDetails(this));
 
         if (mState.action == ACTION_CREATE) {
             final String mimeType = getIntent().getType();
@@ -223,7 +221,7 @@
     @Override
     public boolean onPrepareOptionsMenu(Menu menu) {
         super.onPrepareOptionsMenu(menu);
-        mMenuManager.updateOptionMenu(menu, mDetails);
+        mMenuManager.updateOptionMenu(menu);
 
         final DocumentInfo cwd = getCurrentDirectory();
 
@@ -406,11 +404,6 @@
         return mMenuManager;
     }
 
-    @Override
-    public DirectoryDetails getDirectoryDetails() {
-        return mDetails;
-    }
-
     private static final class PickFinishTask extends PairedTask<PickActivity, Void, Void> {
         private final Uri mUri;
 
diff --git a/tests/unit/com/android/documentsui/manager/MenuManagerTest.java b/tests/unit/com/android/documentsui/manager/MenuManagerTest.java
index 9565b9c..c285b54 100644
--- a/tests/unit/com/android/documentsui/manager/MenuManagerTest.java
+++ b/tests/unit/com/android/documentsui/manager/MenuManagerTest.java
@@ -62,10 +62,11 @@
     private TestMenuItem advanced;
     private TestMenuItem eject;
     private TestSelectionDetails selectionDetails;
-    private TestDirectoryDetails directoryDetails;
+    private TestDirectoryDetails dirDetails;
     private TestSearchViewManager testSearchManager;
     private RootInfo testRootInfo;
     private State state = new State();
+    private MenuManager mgr;
 
     @Before
     public void setUp() {
@@ -94,8 +95,10 @@
         testMenu.findItem(R.id.menu_list).setVisible(true);
 
         selectionDetails = new TestSelectionDetails();
-        directoryDetails = new TestDirectoryDetails();
+        dirDetails = new TestDirectoryDetails();
         testSearchManager = new TestSearchViewManager();
+        mgr = new MenuManager(testSearchManager, state, dirDetails);
+
         testRootInfo = new RootInfo();
     }
 
@@ -104,7 +107,6 @@
         selectionDetails.canDelete = true;
         selectionDetails.canRename = true;
 
-        MenuManager mgr = new MenuManager(testSearchManager, state);
         mgr.updateActionMenu(testMenu, selectionDetails);
 
         rename.assertEnabled();
@@ -117,7 +119,6 @@
     @Test
     public void testActionMenu_containsPartial() {
         selectionDetails.containPartial = true;
-        MenuManager mgr = new MenuManager(testSearchManager, state);
         mgr.updateActionMenu(testMenu, selectionDetails);
 
         rename.assertDisabled();
@@ -129,7 +130,6 @@
     @Test
     public void testActionMenu_cantRename() {
         selectionDetails.canRename = false;
-        MenuManager mgr = new MenuManager(testSearchManager, state);
         mgr.updateActionMenu(testMenu, selectionDetails);
 
         rename.assertDisabled();
@@ -138,7 +138,6 @@
     @Test
     public void testActionMenu_cantDelete() {
         selectionDetails.canDelete = false;
-        MenuManager mgr = new MenuManager(testSearchManager, state);
         mgr.updateActionMenu(testMenu, selectionDetails);
 
         delete.assertInvisible();
@@ -149,7 +148,6 @@
     @Test
     public void testActionMenu_containsDirectory() {
         selectionDetails.containDirectories = true;
-        MenuManager mgr = new MenuManager(testSearchManager, state);
         mgr.updateActionMenu(testMenu, selectionDetails);
 
         // We can't share directories
@@ -158,8 +156,7 @@
 
     @Test
     public void testOptionMenu() {
-        MenuManager mgr = new MenuManager(testSearchManager, state);
-        mgr.updateOptionMenu(testMenu, directoryDetails);
+        mgr.updateOptionMenu(testMenu);
 
         advanced.assertInvisible();
         advanced.assertTitle(R.string.menu_advanced_show);
@@ -171,8 +168,7 @@
     public void testOptionMenu_showAdvanced() {
         state.showAdvanced = true;
         state.showAdvancedOption = true;
-        MenuManager mgr = new MenuManager(testSearchManager, state);
-        mgr.updateOptionMenu(testMenu, directoryDetails);
+        mgr.updateOptionMenu(testMenu);
 
         advanced.assertVisible();
         advanced.assertTitle(R.string.menu_advanced_hide);
@@ -180,27 +176,24 @@
 
     @Test
     public void testOptionMenu_canCreateDirectory() {
-        directoryDetails.canCreateDirectory = true;
-        MenuManager mgr = new MenuManager(testSearchManager, state);
-        mgr.updateOptionMenu(testMenu, directoryDetails);
+        dirDetails.canCreateDirectory = true;
+        mgr.updateOptionMenu(testMenu);
 
         createDir.assertEnabled();
     }
 
     @Test
     public void testOptionMenu_hasRootSettings() {
-        directoryDetails.hasRootSettings = true;
-        MenuManager mgr = new MenuManager(testSearchManager, state);
-        mgr.updateOptionMenu(testMenu, directoryDetails);
+        dirDetails.hasRootSettings = true;
+        mgr.updateOptionMenu(testMenu);
 
         settings.assertVisible();
     }
 
     @Test
     public void testOptionMenu_shouldShowFancyFeatures() {
-        directoryDetails.shouldShowFancyFeatures = true;
-        MenuManager mgr = new MenuManager(testSearchManager, state);
-        mgr.updateOptionMenu(testMenu, directoryDetails);
+        dirDetails.shouldShowFancyFeatures = true;
+        mgr.updateOptionMenu(testMenu);
 
         newWindow.assertVisible();
     }
@@ -208,7 +201,6 @@
     @Test
     public void testInflateContextMenu_Files() {
         TestMenuInflater inflater = new TestMenuInflater();
-        MenuManager mgr = new MenuManager(testSearchManager, state);
 
         selectionDetails.containFiles = true;
         selectionDetails.containDirectories = false;
@@ -220,7 +212,6 @@
     @Test
     public void testInflateContextMenu_Dirs() {
         TestMenuInflater inflater = new TestMenuInflater();
-        MenuManager mgr = new MenuManager(testSearchManager, state);
 
         selectionDetails.containFiles = false;
         selectionDetails.containDirectories = true;
@@ -232,7 +223,6 @@
     @Test
     public void testInflateContextMenu_Mixed() {
         TestMenuInflater inflater = new TestMenuInflater();
-        MenuManager mgr = new MenuManager(testSearchManager, state);
 
         selectionDetails.containFiles = true;
         selectionDetails.containDirectories = true;
@@ -243,8 +233,7 @@
 
     @Test
     public void testContextMenu_EmptyArea() {
-        MenuManager mgr = new MenuManager(testSearchManager, state);
-        mgr.updateContextMenuForContainer(testMenu, directoryDetails);
+        mgr.updateContextMenuForContainer(testMenu);
 
         selectAll.assertVisible();
         paste.assertVisible();
@@ -254,7 +243,6 @@
     @Test
     public void testContextMenu_OnFile() {
         selectionDetails.size = 1;
-        MenuManager mgr = new MenuManager(testSearchManager, state);
         mgr.updateContextMenuForFiles(testMenu, selectionDetails);
         open.assertVisible();
         open.assertEnabled();
@@ -269,7 +257,6 @@
 
     @Test
     public void testContextMenu_OnMultipleFiles() {
-        MenuManager mgr = new MenuManager(testSearchManager, state);
         selectionDetails.size = 3;
         mgr.updateContextMenuForFiles(testMenu, selectionDetails);
         open.assertVisible();
@@ -280,7 +267,6 @@
 
     @Test
     public void testContextMenu_OnWritableDirectory() {
-        MenuManager mgr = new MenuManager(testSearchManager, state);
         selectionDetails.size = 1;
         selectionDetails.canPasteInto = true;
         mgr.updateContextMenuForDirs(testMenu, selectionDetails);
@@ -296,7 +282,6 @@
 
     @Test
     public void testContextMenu_OnNonWritableDirectory() {
-        com.android.documentsui.manager.MenuManager mgr = new MenuManager(testSearchManager, state);
         selectionDetails.size = 1;
         selectionDetails.canPasteInto = false;
         mgr.updateContextMenuForDirs(testMenu, selectionDetails);
@@ -312,7 +297,6 @@
 
     @Test
     public void testContextMenu_OnMultipleDirectories() {
-        MenuManager mgr = new MenuManager(testSearchManager, state);
         selectionDetails.size = 3;
         mgr.updateContextMenuForDirs(testMenu, selectionDetails);
         openInNewWindow.assertVisible();
@@ -321,7 +305,6 @@
 
     @Test
     public void testContextMenu_OnMixedDocs() {
-        MenuManager mgr = new MenuManager(testSearchManager, state);
         selectionDetails.containDirectories = true;
         selectionDetails.containFiles = true;
         selectionDetails.size = 2;
@@ -337,7 +320,6 @@
 
     @Test
     public void testContextMenu_OnMixedDocs_hasPartialFile() {
-        MenuManager mgr = new MenuManager(testSearchManager, state);
         selectionDetails.containDirectories = true;
         selectionDetails.containFiles = true;
         selectionDetails.size = 2;
@@ -354,7 +336,6 @@
 
     @Test
     public void testContextMenu_OnMixedDocs_hasUndeletableFile() {
-        MenuManager mgr = new MenuManager(testSearchManager, state);
         selectionDetails.containDirectories = true;
         selectionDetails.containFiles = true;
         selectionDetails.size = 2;
@@ -370,7 +351,6 @@
 
     @Test
     public void testRootContextMenu() {
-        MenuManager mgr = new MenuManager(testSearchManager, state);
         mgr.updateRootContextMenu(testMenu, testRootInfo);
 
         eject.assertVisible();
@@ -383,7 +363,6 @@
     @Test
     public void testRootContextMenu_hasRootSettings() {
         testRootInfo.flags = Root.FLAG_HAS_SETTINGS;
-        MenuManager mgr = new MenuManager(testSearchManager, state);
         mgr.updateRootContextMenu(testMenu, testRootInfo);
 
         settings.assertEnabled();
@@ -392,7 +371,6 @@
     @Test
     public void testRootContextMenu_eject() {
         testRootInfo.flags = Root.FLAG_SUPPORTS_EJECT;
-        MenuManager mgr = new MenuManager(testSearchManager, state);
         mgr.updateRootContextMenu(testMenu, testRootInfo);
 
         eject.assertEnabled();
@@ -402,7 +380,6 @@
     public void testRootContextMenu_ejectInProcess() {
         testRootInfo.flags = Root.FLAG_SUPPORTS_EJECT;
         testRootInfo.ejecting = true;
-        MenuManager mgr = new MenuManager(testSearchManager, state);
         mgr.updateRootContextMenu(testMenu, testRootInfo);
 
         eject.assertDisabled();
diff --git a/tests/unit/com/android/documentsui/picker/MenuManagerTest.java b/tests/unit/com/android/documentsui/picker/MenuManagerTest.java
index 7a0eec7..1ca593e 100644
--- a/tests/unit/com/android/documentsui/picker/MenuManagerTest.java
+++ b/tests/unit/com/android/documentsui/picker/MenuManagerTest.java
@@ -63,10 +63,11 @@
     private TestMenuItem eject;
 
     private TestSelectionDetails selectionDetails;
-    private TestDirectoryDetails directoryDetails;
+    private TestDirectoryDetails dirDetails;
     private TestSearchViewManager testSearchManager;
     private State state = new State();
     private RootInfo testRootInfo;
+    private MenuManager mgr;
 
     @Before
     public void setUp() {
@@ -91,8 +92,10 @@
         eject = testMenu.findItem(R.id.menu_eject_root);
 
         selectionDetails = new TestSelectionDetails();
-        directoryDetails = new TestDirectoryDetails();
+        dirDetails = new TestDirectoryDetails();
         testSearchManager = new TestSearchViewManager();
+        mgr = new MenuManager(testSearchManager, state, dirDetails);
+
         testRootInfo = new RootInfo();
         state.action = ACTION_CREATE;
         state.allowMultiple = true;
@@ -100,7 +103,6 @@
 
     @Test
     public void testActionMenu() {
-        MenuManager mgr = new MenuManager(testSearchManager, state);
         mgr.updateActionMenu(testMenu, selectionDetails);
 
         open.assertInvisible();
@@ -113,7 +115,6 @@
     @Test
     public void testActionMenu_openAction() {
         state.action = ACTION_OPEN;
-        MenuManager mgr = new MenuManager(testSearchManager, state);
         mgr.updateActionMenu(testMenu, selectionDetails);
 
         open.assertVisible();
@@ -123,7 +124,6 @@
     @Test
     public void testActionMenu_notAllowMultiple() {
         state.allowMultiple = false;
-        MenuManager mgr = new MenuManager(testSearchManager, state);
         mgr.updateActionMenu(testMenu, selectionDetails);
 
         selectAll.assertInvisible();
@@ -131,8 +131,7 @@
 
     @Test
     public void testOptionMenu() {
-        MenuManager mgr = new MenuManager(testSearchManager, state);
-        mgr.updateOptionMenu(testMenu, directoryDetails);
+        mgr.updateOptionMenu(testMenu);
 
         advanced.assertInvisible();
         advanced.assertTitle(R.string.menu_advanced_show);
@@ -144,8 +143,7 @@
     public void testOptionMenu_notPicking() {
         state.action = ACTION_OPEN;
         state.derivedMode = State.MODE_LIST;
-        MenuManager mgr = new MenuManager(testSearchManager, state);
-        mgr.updateOptionMenu(testMenu, directoryDetails);
+        mgr.updateOptionMenu(testMenu);
 
         createDir.assertInvisible();
         grid.assertVisible();
@@ -155,9 +153,8 @@
 
     @Test
     public void testOptionMenu_canCreateDirectory() {
-        MenuManager mgr = new MenuManager(testSearchManager, state);
-        directoryDetails.canCreateDirectory = true;
-        mgr.updateOptionMenu(testMenu, directoryDetails);
+        dirDetails.canCreateDirectory = true;
+        mgr.updateOptionMenu(testMenu);
 
         createDir.assertEnabled();
     }
@@ -166,8 +163,7 @@
     public void testOptionMenu_showAdvanced() {
         state.showAdvanced = true;
         state.showAdvancedOption = true;
-        MenuManager mgr = new MenuManager(testSearchManager, state);
-        mgr.updateOptionMenu(testMenu, directoryDetails);
+        mgr.updateOptionMenu(testMenu);
 
         advanced.assertVisible();
         advanced.assertTitle(R.string.menu_advanced_hide);
@@ -175,9 +171,8 @@
 
     @Test
     public void testOptionMenu_inRecents() {
-        MenuManager mgr = new MenuManager(testSearchManager, state);
-        directoryDetails.isInRecents = true;
-        mgr.updateOptionMenu(testMenu, directoryDetails);
+        dirDetails.isInRecents = true;
+        mgr.updateOptionMenu(testMenu);
 
         grid.assertInvisible();
         list.assertInvisible();
@@ -185,8 +180,7 @@
 
     @Test
     public void testContextMenu_EmptyArea() {
-        MenuManager mgr = new MenuManager(testSearchManager, state);
-        mgr.updateContextMenuForContainer(testMenu, directoryDetails);
+        mgr.updateContextMenuForContainer(testMenu);
         selectAll.assertVisible();
         paste.assertVisible();
         createDir.assertVisible();
@@ -194,7 +188,6 @@
 
     @Test
     public void testContextMenu_OnFile() {
-        MenuManager mgr = new MenuManager(testSearchManager, state);
         mgr.updateContextMenuForFiles(testMenu, selectionDetails);
         // We don't want share in pickers.
         share.assertInvisible();
@@ -208,7 +201,6 @@
 
     @Test
     public void testContextMenu_OnDirectory() {
-        MenuManager mgr = new MenuManager(testSearchManager, state);
         selectionDetails.canPasteInto = true;
         mgr.updateContextMenuForDirs(testMenu, selectionDetails);
         // We don't want openInNewWindow in pickers
@@ -223,7 +215,6 @@
 
     @Test
     public void testContextMenu_OnMixedDocs() {
-        MenuManager mgr = new MenuManager(testSearchManager, state);
         selectionDetails.containDirectories = true;
         selectionDetails.containFiles = true;
         selectionDetails.size = 2;
@@ -236,7 +227,6 @@
 
     @Test
     public void testContextMenu_OnMixedDocs_hasPartialFile() {
-        MenuManager mgr = new MenuManager(testSearchManager, state);
         selectionDetails.containDirectories = true;
         selectionDetails.containFiles = true;
         selectionDetails.size = 2;
@@ -253,7 +243,6 @@
 
     @Test
     public void testContextMenu_OnMixedDocs_hasUndeletableFile() {
-        MenuManager mgr = new MenuManager(testSearchManager, state);
         selectionDetails.containDirectories = true;
         selectionDetails.containFiles = true;
         selectionDetails.size = 2;
@@ -269,7 +258,6 @@
 
     @Test
     public void testRootContextMenu() {
-        MenuManager mgr = new MenuManager(testSearchManager, state);
         mgr.updateRootContextMenu(testMenu, testRootInfo);
 
         eject.assertInvisible();
@@ -278,7 +266,6 @@
 
     @Test
     public void testRootContextMenu_hasRootSettings() {
-        MenuManager mgr = new MenuManager(testSearchManager, state);
         testRootInfo.flags = Root.FLAG_HAS_SETTINGS;
         mgr.updateRootContextMenu(testMenu, testRootInfo);
 
@@ -287,7 +274,6 @@
 
     @Test
     public void testRootContextMenu_canEject() {
-        MenuManager mgr = new MenuManager(testSearchManager, state);
         testRootInfo.flags = Root.FLAG_SUPPORTS_EJECT;
         mgr.updateRootContextMenu(testMenu, testRootInfo);
 
