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

Commit b285b40d authored by Garfield Tan's avatar Garfield Tan
Browse files

Make root context menu match spec.

Bug: 31345822
Change-Id: Ibec233cde74092ffe055639e97ed6946c5908c0b
parent b3a22636
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -18,6 +18,12 @@
    <item
        android:id="@+id/menu_eject_root"
        android:title="@string/menu_eject_root" />
    <item
        android:id="@+id/menu_open_in_new_window"
        android:title="@string/menu_open_in_new_window" />
    <item
        android:id="@+id/menu_paste_into_folder"
        android:title="@string/menu_paste_into_folder" />
    <item
        android:id="@+id/menu_settings"
        android:title="@string/menu_settings" />
+17 −4
Original line number Diff line number Diff line
@@ -19,18 +19,18 @@ package com.android.documentsui;
import android.content.ClipData;
import android.content.pm.ResolveInfo;

import com.android.documentsui.base.CheckedTask.Check;
import com.android.documentsui.base.DocumentInfo;
import com.android.documentsui.base.RootInfo;
import com.android.documentsui.clipping.DocumentClipper;
import com.android.documentsui.dirlist.DocumentDetails;
import com.android.documentsui.sidebar.EjectRootTask;
import com.android.documentsui.sidebar.RootsFragment;

import java.util.function.BooleanSupplier;
import java.util.function.Consumer;

/**
 * Provides support for specializing the actions (openDocument etc.) to the host activity.
 * Provides support for specializing the actions (viewDocument etc.) to the host activity.
 */
public abstract class ActionHandler<T extends BaseActivity> {

@@ -44,10 +44,15 @@ public abstract class ActionHandler<T extends BaseActivity> {
        throw new UnsupportedOperationException("Can't open settings.");
    }

    public boolean dropOn(ClipData data, RootsFragment fragment, RootInfo root) {
    /**
     * Drops documents on a root.
     * @param check The check to make sure RootsFragment is not detached from activity.
     */
    public boolean dropOn(ClipData data, RootInfo root) {
        new GetRootDocumentTask(
                root,
                fragment,
                mActivity,
                mActivity::isDestroyed,
                (DocumentInfo doc) -> dropOn(data, root, doc)
        ).executeOnExecutor(ProviderExecutor.forAuthority(root.authority));
        return true;
@@ -95,6 +100,14 @@ public abstract class ActionHandler<T extends BaseActivity> {
        throw new UnsupportedOperationException("Can't open an app.");
    }

    public void openInNewWindow(RootInfo root) {
        throw new UnsupportedOperationException("Can't open in new window");
    }

    public void pasteIntoFolder(RootInfo root) {
        throw new UnsupportedOperationException("Can't paste into folder.");
    }

    public boolean viewDocument(DocumentDetails doc) {
        throw new UnsupportedOperationException("Direct view not supported!");
    }
+1 −1
Original line number Diff line number Diff line
@@ -51,7 +51,7 @@ public class GetRootDocumentTask extends CheckedTask<Void, DocumentInfo> {
        this(rootInfo, fragment.getContext(), fragment::isDetached, callback);
    }

    private GetRootDocumentTask(
    public GetRootDocumentTask(
            RootInfo rootInfo, Context context, Check check, Consumer<DocumentInfo> callback) {
        super(check);
        mRootInfo = rootInfo;
+16 −2
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ import com.android.documentsui.base.RootInfo;
import com.android.documentsui.base.Shared;
import com.android.documentsui.base.State;
import com.android.documentsui.dirlist.DirectoryFragment;
import com.android.documentsui.sidebar.RootsFragment;
import com.android.internal.annotations.VisibleForTesting;

public abstract class MenuManager {
@@ -181,11 +182,15 @@ public abstract class MenuManager {
     * @see RootsFragment#onCreateContextMenu
     */
    public void updateRootContextMenu(Menu menu, RootInfo root) {
        MenuItem settings = menu.findItem(R.id.menu_settings);
        MenuItem eject = menu.findItem(R.id.menu_eject_root);
        MenuItem pasteInto = menu.findItem(R.id.menu_paste_into_folder);
        MenuItem openInNewWindow = menu.findItem(R.id.menu_open_in_new_window);
        MenuItem settings = menu.findItem(R.id.menu_settings);

        updateSettings(settings, root);
        updateEject(eject, root);
        updatePasteInto(pasteInto, root);
        updateOpenInNewWindow(openInNewWindow, root);
        updateSettings(settings, root);
    }

    protected void updateModePicker(MenuItem grid, MenuItem list) {
@@ -228,6 +233,11 @@ public abstract class MenuManager {
        openInNewWindow.setVisible(false);
    }

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

    protected void updateShare(MenuItem share, SelectionDetails selectionDetails) {
        share.setVisible(false);
    }
@@ -252,6 +262,10 @@ public abstract class MenuManager {
        pasteInto.setVisible(false);
    }

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

    protected abstract void updateOpenInContextMenu(
            MenuItem open, SelectionDetails selectionDetails);
    protected abstract void updateSelectAll(MenuItem selectAll);
+35 −0
Original line number Diff line number Diff line
@@ -18,8 +18,13 @@ package com.android.documentsui.manager;

import android.util.Log;

import com.android.documentsui.DocumentsApplication;
import com.android.documentsui.GetRootDocumentTask;
import com.android.documentsui.ProviderExecutor;
import com.android.documentsui.base.DocumentInfo;
import com.android.documentsui.base.DocumentStack;
import com.android.documentsui.base.RootInfo;
import com.android.documentsui.clipping.DocumentClipper;
import com.android.documentsui.dirlist.DocumentDetails;
import com.android.documentsui.dirlist.FragmentTuner;
import com.android.documentsui.dirlist.Model;
@@ -48,6 +53,36 @@ public class ActionHandler extends com.android.documentsui.ActionHandler<ManageA
        mActivity.openRootSettings(root);
    }

    @Override
    public void openInNewWindow(RootInfo root) {
        new GetRootDocumentTask(
                root,
                mActivity,
                mActivity::isDestroyed,
                (DocumentInfo doc) -> openInNewWindow(root, doc)
        ).executeOnExecutor(ProviderExecutor.forAuthority(root.authority));
    }

    private void openInNewWindow(RootInfo root, DocumentInfo doc) {
        mActivity.openInNewWindow(new DocumentStack(root), doc);
    }

    @Override
    public void pasteIntoFolder(RootInfo root) {
        new GetRootDocumentTask(
                root,
                mActivity,
                mActivity::isDestroyed,
                (DocumentInfo doc) -> pasteIntoFolder(root, doc)
        ).executeOnExecutor(ProviderExecutor.forAuthority(root.authority));
    }

    private void pasteIntoFolder(RootInfo root, DocumentInfo doc) {
        DocumentClipper clipper = DocumentsApplication.getDocumentClipper(mActivity);
        DocumentStack stack = new DocumentStack(root, doc);
        clipper.copyFromClipboard(doc, stack, mActivity.fileOpCallback);
    }

    @Override
    public boolean openDocument(DocumentDetails details) {
        DocumentInfo doc = mConfig.model.getDocument(details.getModelId());
Loading