Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6c1fbb78 authored by Zemiao Zhu's avatar Zemiao Zhu Committed by Diksha Gohlyan
Browse files

Hide all disabled overflow menu items.

Bug: 145573285
Test: atest DocumentsUIGoogleTest
Change-Id: I2b6be93f9264bb27ea5e14444851e3d511176d1a
parent d2db36ca
Loading
Loading
Loading
Loading
+32 −31
Original line number Diff line number Diff line
@@ -207,11 +207,11 @@ public abstract class MenuManager {
        final boolean canCopy =
                selectionDetails.size() > 0 && !selectionDetails.containsPartialFiles();
        final boolean canDelete = selectionDetails.canDelete();
        cut.setEnabled(canCopy && canDelete);
        copy.setEnabled(canCopy);
        delete.setEnabled(canDelete);
        Menus.setEnabledAndVisible(cut, canCopy && canDelete);
        Menus.setEnabledAndVisible(copy, canCopy);
        Menus.setEnabledAndVisible(delete, canDelete);

        inspect.setEnabled(selectionDetails.size() == 1);
        Menus.setEnabledAndVisible(inspect, selectionDetails.size() == 1);
    }

    /**
@@ -227,7 +227,8 @@ public abstract class MenuManager {
        MenuItem createDir = menu.findItem(R.id.dir_menu_create_dir);
        MenuItem inspect = menu.findItem(R.id.dir_menu_inspect);

        paste.setEnabled(mDirDetails.hasItemsToPaste() && mDirDetails.canCreateDoc());
        Menus.setEnabledAndVisible(paste,
                mDirDetails.hasItemsToPaste() && mDirDetails.canCreateDoc());
        updateSelectAll(selectAll, selectionDetails);
        updateDeselectAll(deselectAll, selectionDetails);
        updateCreateDir(createDir);
@@ -253,62 +254,62 @@ public abstract class MenuManager {
            List<KeyboardShortcutGroup> data, IntFunction<String> stringSupplier);

    protected void updateModePicker(MenuItem grid, MenuItem list) {
        grid.setVisible(mState.derivedMode != State.MODE_GRID);
        list.setVisible(mState.derivedMode != State.MODE_LIST);
        Menus.setEnabledAndVisible(grid, mState.derivedMode != State.MODE_GRID);
        Menus.setEnabledAndVisible(list, mState.derivedMode != State.MODE_LIST);
    }

    protected void updateSort(MenuItem sort) {
        sort.setVisible(true);
        Menus.setEnabledAndVisible(sort, true);
    }

    protected void updateDebug(MenuItem debug) {
        debug.setVisible(mState.debugMode);
        Menus.setEnabledAndVisible(debug, mState.debugMode);
    }

    protected void updateSettings(MenuItem settings) {
        settings.setVisible(false);
        Menus.setEnabledAndVisible(settings, false);
    }

    protected void updateSettings(MenuItem settings, RootInfo root) {
        settings.setVisible(false);
        Menus.setEnabledAndVisible(settings, false);
    }

    protected void updateEject(MenuItem eject, RootInfo root) {
        eject.setVisible(false);
        Menus.setEnabledAndVisible(eject, false);
    }

    protected void updateNewWindow(MenuItem newWindow) {
        newWindow.setVisible(false);
        Menus.setEnabledAndVisible(newWindow, false);
    }

    protected void updateSelect(MenuItem select, SelectionDetails selectionDetails) {
        select.setVisible(false);
        Menus.setEnabledAndVisible(select, false);
    }

    protected void updateOpenWith(MenuItem openWith, SelectionDetails selectionDetails) {
        openWith.setVisible(false);
        Menus.setEnabledAndVisible(openWith, false);
    }

    protected void updateOpenInNewWindow(
            MenuItem openInNewWindow, SelectionDetails selectionDetails) {
        openInNewWindow.setVisible(false);
        Menus.setEnabledAndVisible(openInNewWindow, false);
    }

    protected void updateOpenInNewWindow(
            MenuItem openInNewWindow, RootInfo root) {
        openInNewWindow.setVisible(false);
        Menus.setEnabledAndVisible(openInNewWindow, false);
    }

    protected void updateShare(MenuItem share, SelectionDetails selectionDetails) {
        share.setVisible(false);
        Menus.setEnabledAndVisible(share, false);
    }

    protected void updateDelete(MenuItem delete, SelectionDetails selectionDetails) {
        delete.setVisible(false);
        Menus.setEnabledAndVisible(delete, false);
    }

    protected void updateRename(MenuItem rename, SelectionDetails selectionDetails) {
        rename.setVisible(false);
        Menus.setEnabledAndVisible(rename, false);
    }

    /**
@@ -316,50 +317,50 @@ public abstract class MenuManager {
     * to when there is a selection.
     */
    protected void updateInspect(MenuItem inspector) {
        inspector.setVisible(false);
        Menus.setEnabledAndVisible(inspector, false);
    }

    /**
     * This method is called for action mode, when a selection exists.
     */
    protected void updateInspect(MenuItem inspect, SelectionDetails selectionDetails) {
        inspect.setVisible(false);
        Menus.setEnabledAndVisible(inspect, false);
    }

    protected void updateViewInOwner(MenuItem view, SelectionDetails selectionDetails) {
        view.setVisible(false);
        Menus.setEnabledAndVisible(view, false);
    }

    protected void updateMoveTo(MenuItem moveTo, SelectionDetails selectionDetails) {
        moveTo.setVisible(false);
        Menus.setEnabledAndVisible(moveTo, false);
    }

    protected void updateCopyTo(MenuItem copyTo, SelectionDetails selectionDetails) {
        copyTo.setVisible(false);
        Menus.setEnabledAndVisible(copyTo, false);
    }

    protected void updateCompress(MenuItem compress, SelectionDetails selectionDetails) {
        compress.setVisible(false);
        Menus.setEnabledAndVisible(compress, false);
    }

    protected void updateExtractTo(MenuItem extractTo, SelectionDetails selectionDetails) {
        extractTo.setVisible(false);
        Menus.setEnabledAndVisible(extractTo, false);
    }

    protected void updatePasteInto(MenuItem pasteInto, SelectionDetails selectionDetails) {
        pasteInto.setVisible(false);
        Menus.setEnabledAndVisible(pasteInto, false);
    }

    protected void updatePasteInto(MenuItem pasteInto, RootInfo root, DocumentInfo docInfo) {
        pasteInto.setVisible(false);
        Menus.setEnabledAndVisible(pasteInto, false);
    }

    protected void updateOpenInContextMenu(MenuItem open, SelectionDetails selectionDetails) {
        open.setVisible(false);
        Menus.setEnabledAndVisible(open, false);
    }

    protected void updateLauncher(MenuItem launcher) {
        launcher.setVisible(false);
        Menus.setEnabledAndVisible(launcher, false);
    }

    protected abstract void updateSelectAll(MenuItem selectAll);
+8 −1
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ public final class Menus {
        for (int i = 0; i < menu.size(); i++) {
            MenuItem item = menu.getItem(i);
            if (item.isVisible()) {
                item.setEnabled(true);
                continue;
            }
            if (contains(exclusions, item)) {
@@ -39,6 +40,12 @@ public final class Menus {
        }
    }

    /** Set enabled/disabled state of a menuItem, and updates its visibility. */
    public static void setEnabledAndVisible(MenuItem item, boolean enabled) {
        item.setEnabled(enabled);
        item.setVisible(enabled);
    }

    private static boolean contains(MenuItem[] exclusions, MenuItem item) {
        for (int x = 0; x < exclusions.length; x++) {
            if (exclusions[x] == item) {
+33 −48
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@ import com.android.documentsui.base.DocumentInfo;
import com.android.documentsui.base.Features;
import com.android.documentsui.base.Lookup;
import com.android.documentsui.base.LookupApplicationName;
import com.android.documentsui.base.Menus;
import com.android.documentsui.base.RootInfo;
import com.android.documentsui.base.Shared;
import com.android.documentsui.base.State;
@@ -139,39 +140,34 @@ public final class MenuManager extends com.android.documentsui.MenuManager {

    @Override
    protected void updateSettings(MenuItem settings, RootInfo root) {
        settings.setVisible(true);
        settings.setEnabled(root.hasSettings());
        Menus.setEnabledAndVisible(settings, root.hasSettings());
    }

    @Override
    protected void updateEject(MenuItem eject, RootInfo root) {
        eject.setVisible(root.supportsEject());
        eject.setEnabled(!root.ejecting);
        Menus.setEnabledAndVisible(eject, root.supportsEject() && !root.ejecting);
    }

    @Override
    protected void updateSettings(MenuItem settings) {
        boolean enabled = mDirDetails.hasRootSettings();
        settings.setVisible(enabled);
        settings.setEnabled(enabled);
        Menus.setEnabledAndVisible(settings, enabled);
    }

    @Override
    protected void updateNewWindow(MenuItem newWindow) {
        newWindow.setVisible(true);
        Menus.setEnabledAndVisible(newWindow, true);
    }

    @Override
    protected void updateOpenWith(MenuItem openWith, SelectionDetails selectionDetails) {
        openWith.setVisible(true);
        openWith.setEnabled(selectionDetails.canOpenWith());
        Menus.setEnabledAndVisible(openWith, selectionDetails.canOpenWith());
    }

    @Override
    protected void updateOpenInNewWindow(
            MenuItem openInNewWindow, SelectionDetails selectionDetails) {
        openInNewWindow.setVisible(true);
        openInNewWindow.setEnabled(selectionDetails.size() == 1
        Menus.setEnabledAndVisible(openInNewWindow, selectionDetails.size() == 1
            && !selectionDetails.containsPartialFiles());
    }

@@ -182,42 +178,40 @@ public final class MenuManager extends com.android.documentsui.MenuManager {

    @Override
    protected void updateMoveTo(MenuItem moveTo, SelectionDetails selectionDetails) {
        moveTo.setVisible(true);
        moveTo.setEnabled(!selectionDetails.containsPartialFiles() && selectionDetails.canDelete());
        Menus.setEnabledAndVisible(moveTo,
                !selectionDetails.containsPartialFiles() && selectionDetails.canDelete());
    }

    @Override
    protected void updateCopyTo(MenuItem copyTo, SelectionDetails selectionDetails) {
        copyTo.setVisible(true);
        copyTo.setEnabled(!selectionDetails.containsPartialFiles() &&
                !selectionDetails.canExtract());
        Menus.setEnabledAndVisible(copyTo, !selectionDetails.containsPartialFiles()
                && !selectionDetails.canExtract());
    }

    @Override
    protected void updateCompress(MenuItem compress, SelectionDetails selectionDetails) {
        final boolean readOnly = !mDirDetails.canCreateDoc();
        compress.setVisible(mFeatures.isArchiveCreationEnabled());
        compress.setEnabled(!readOnly && !selectionDetails.containsPartialFiles() &&
                !selectionDetails.canExtract());
        Menus.setEnabledAndVisible(compress, mFeatures.isArchiveCreationEnabled()
                && !readOnly
                && !selectionDetails.containsPartialFiles()
                && !selectionDetails.canExtract());
    }

    @Override
    protected void updateExtractTo(MenuItem extractTo, SelectionDetails selectionDetails) {
        boolean enabled = selectionDetails.canExtract();
        extractTo.setVisible(enabled);
        extractTo.setEnabled(enabled);
        Menus.setEnabledAndVisible(extractTo, enabled);
    }

    @Override
    protected void updatePasteInto(MenuItem pasteInto, SelectionDetails selectionDetails) {
        pasteInto.setVisible(true);
        pasteInto.setEnabled(selectionDetails.canPasteInto() && mDirDetails.hasItemsToPaste());
        Menus.setEnabledAndVisible(pasteInto,
                selectionDetails.canPasteInto() && mDirDetails.hasItemsToPaste());
    }

    @Override
    protected void updatePasteInto(MenuItem pasteInto, RootInfo root, DocumentInfo docInfo) {
        pasteInto.setVisible(true);
        pasteInto.setEnabled(root.supportsCreate()
        Menus.setEnabledAndVisible(pasteInto, root.supportsCreate()
                && docInfo != null
                && docInfo.isCreateSupported()
                && mDirDetails.hasItemsToPaste());
@@ -225,28 +219,24 @@ public final class MenuManager extends com.android.documentsui.MenuManager {

    @Override
    protected void updateSelectAll(MenuItem selectAll) {
        selectAll.setVisible(true);
        selectAll.setEnabled(true);
        Menus.setEnabledAndVisible(selectAll, true);
    }

    @Override
    protected void updateSelectAll(MenuItem selectAll, SelectionDetails selectionDetails) {
        final boolean visible = selectionDetails.size() < mFilesCountSupplier.getAsInt();
        selectAll.setVisible(visible);
        selectAll.setEnabled(visible);
        Menus.setEnabledAndVisible(selectAll, visible);
    }

    @Override
    protected void updateDeselectAll(MenuItem deselectAll, SelectionDetails selectionDetails) {
        final boolean visible = selectionDetails.size() == mFilesCountSupplier.getAsInt();
        deselectAll.setVisible(visible);
        deselectAll.setEnabled(visible);
        Menus.setEnabledAndVisible(deselectAll, visible);
    }

    @Override
    protected void updateCreateDir(MenuItem createDir) {
        createDir.setVisible(true);
        createDir.setEnabled(mDirDetails.canCreateDirectory());
        Menus.setEnabledAndVisible(createDir, mDirDetails.canCreateDirectory());
    }

    @Override
@@ -254,43 +244,38 @@ public final class MenuManager extends com.android.documentsui.MenuManager {
        boolean enabled = !selectionDetails.containsDirectories()
                && !selectionDetails.containsPartialFiles()
                && !selectionDetails.canExtract();
        share.setVisible(enabled);
        share.setEnabled(enabled);
        Menus.setEnabledAndVisible(share, enabled);
    }

    @Override
    protected void updateDelete(MenuItem delete, SelectionDetails selectionDetails) {
        boolean enabled = selectionDetails.canDelete();
        delete.setVisible(enabled);
        delete.setEnabled(enabled);
        Menus.setEnabledAndVisible(delete, enabled);
    }

    @Override
    protected void updateRename(MenuItem rename, SelectionDetails selectionDetails) {
        rename.setVisible(true);
        rename.setEnabled(!selectionDetails.containsPartialFiles() && selectionDetails.canRename());
        Menus.setEnabledAndVisible(rename,
                !selectionDetails.containsPartialFiles() && selectionDetails.canRename());
    }

    @Override
    protected void updateInspect(MenuItem inspect) {
        boolean visible = mFeatures.isInspectorEnabled();
        inspect.setVisible(visible);
        inspect.setEnabled(visible && mDirDetails.canInspectDirectory());
        Menus.setEnabledAndVisible(inspect, visible && mDirDetails.canInspectDirectory());
    }

    @Override
    protected void updateInspect(MenuItem inspect, SelectionDetails selectionDetails) {
        boolean visible = mFeatures.isInspectorEnabled();
        inspect.setVisible(visible);
        inspect.setEnabled(visible && selectionDetails.size() <= 1);
        boolean visible = mFeatures.isInspectorEnabled() && selectionDetails.size() <= 1;
        Menus.setEnabledAndVisible(inspect, visible);
    }

    @Override
    protected void updateViewInOwner(MenuItem view, SelectionDetails selectionDetails) {
        if (selectionDetails.canViewInOwner() &&
                mSelectionManager.getSelection().iterator().hasNext()) {
            view.setVisible(true);
            view.setEnabled(true);
            Menus.setEnabledAndVisible(view, true);
            Resources res = mContext.getResources();
            String selectedModelId = mSelectionManager.getSelection().iterator().next();
            Uri selectedUri = mUriLookup.lookup(selectedModelId);
@@ -300,13 +285,13 @@ public final class MenuManager extends com.android.documentsui.MenuManager {
            view.setTitle(title);
        }
        else {
            view.setVisible(false);
            Menus.setEnabledAndVisible(view, false);
        }
    }

    @Override
    protected void updateLauncher(MenuItem launcher) {
        launcher.setVisible(mState.debugMode);
        Menus.setEnabledAndVisible(launcher, mState.debugMode);
        launcher.setTitle(Shared.isLauncherEnabled(mContext)
                ? "Hide launcher icon" : "Show launcher icon");
    }
+15 −19
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ import android.view.MenuItem;

import com.android.documentsui.Model;
import com.android.documentsui.R;
import com.android.documentsui.base.Menus;
import com.android.documentsui.base.MimeTypes;
import com.android.documentsui.base.State;
import com.android.documentsui.queries.SearchViewManager;
@@ -94,8 +95,8 @@ public final class MenuManager extends com.android.documentsui.MenuManager {
    protected void updateModePicker(MenuItem grid, MenuItem list) {
        // No display options in recent directories
        if (picking() && mDirDetails.isInRecents()) {
            grid.setVisible(false);
            list.setVisible(false);
            Menus.setEnabledAndVisible(grid, false);
            Menus.setEnabledAndVisible(list, false);
        } else {
            super.updateModePicker(grid, list);
        }
@@ -103,43 +104,38 @@ public final class MenuManager extends com.android.documentsui.MenuManager {

    @Override
    protected void updateSelectAll(MenuItem selectAll) {
        boolean visible = mState.allowMultiple;
        boolean enabled = visible && !mOnlyDirectory;
        selectAll.setVisible(visible);
        selectAll.setEnabled(enabled);
        boolean visible = mState.allowMultiple && !mOnlyDirectory;
        Menus.setEnabledAndVisible(selectAll, visible);
    }

    @Override
    protected void updateSelectAll(MenuItem selectAll, SelectionDetails selectionDetails) {
        final boolean visible = mState.allowMultiple
                && selectionDetails.size() < mFilesCountSupplier.getAsInt();
        final boolean enabled = visible && !mOnlyDirectory;
        selectAll.setVisible(visible);
        selectAll.setEnabled(enabled);
                && selectionDetails.size() < mFilesCountSupplier.getAsInt()
                && !mOnlyDirectory;
        Menus.setEnabledAndVisible(selectAll, visible);
    }

    @Override
    protected void updateDeselectAll(MenuItem deselectAll, SelectionDetails selectionDetails) {
        final boolean visible = mState.allowMultiple
                && selectionDetails.size() == mFilesCountSupplier.getAsInt();
        final boolean enabled = visible && !mOnlyDirectory;
        deselectAll.setVisible(visible);
        deselectAll.setEnabled(enabled);
                && selectionDetails.size() == mFilesCountSupplier.getAsInt()
                && !mOnlyDirectory;
        Menus.setEnabledAndVisible(deselectAll, visible);
    }

    @Override
    protected void updateCreateDir(MenuItem createDir) {
        createDir.setShowAsAction(picking()
                ? MenuItem.SHOW_AS_ACTION_ALWAYS : MenuItem.SHOW_AS_ACTION_NEVER);
        createDir.setVisible(picking());
        createDir.setEnabled(picking() && mDirDetails.canCreateDirectory());
        Menus.setEnabledAndVisible(createDir, picking() && mDirDetails.canCreateDirectory());
    }

    @Override
    protected void updateSelect(MenuItem select, SelectionDetails selectionDetails) {
        select.setVisible(mState.action == ACTION_GET_CONTENT
                || mState.action == ACTION_OPEN);
        select.setEnabled(selectionDetails.size() > 0);
        Menus.setEnabledAndVisible(select, (mState.action == ACTION_GET_CONTENT
                || mState.action == ACTION_OPEN)
                && selectionDetails.size() > 0);
        select.setTitle(R.string.menu_select);
    }
}
+7 −2
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ import static androidx.test.espresso.matcher.ViewMatchers.withText;

import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertNull;
import static junit.framework.Assert.assertTrue;

import static org.hamcrest.CoreMatchers.allOf;
@@ -111,8 +112,12 @@ public class UiBot extends Bots.BaseBot {

    public void assertMenuEnabled(int id, boolean enabled) {
        UiObject2 menu = findMenuWithName(mContext.getString(id));
        if (enabled) {
            assertNotNull(menu);
            assertEquals(enabled, menu.isEnabled());
        } else {
            assertNull(menu);
        }
    }

    public void assertInActionMode(boolean inActionMode) {
Loading