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

Commit 68f4bfb0 authored by Ben Kwa's avatar Ben Kwa
Browse files

Add delete key support.

- Pull the action mode up from the ActionMode listener into the
  DirectoryFragment.  There is no way to globally check on action mode,
  so fragment-level coordination on the action mode requires a
  fragment-level variable.

- Add a key handling clause for the delete key.  Unfortunately this
  can't be set up as a shortcut key, because shortcuts all have to be
  modified with the "Ctrl" key.

BUG=27409328

Change-Id: I48d1c87613ee7434728828e3b745fadb3bc915c1
parent 146f12c4
Loading
Loading
Loading
Loading
+17 −7
Original line number Diff line number Diff line
@@ -98,7 +98,6 @@ import com.android.documentsui.model.RootInfo;
import com.android.documentsui.services.FileOperationService;
import com.android.documentsui.services.FileOperationService.OpType;
import com.android.documentsui.services.FileOperations;

import com.google.common.collect.Lists;

import java.lang.annotation.Retention;
@@ -165,6 +164,7 @@ public class DirectoryFragment extends Fragment
    private String mQuery = null;
    private Selection mSelection = null;
    private boolean mSearchMode = false;
    private @Nullable ActionMode mActionMode;

    @Override
    public View onCreateView(
@@ -439,7 +439,6 @@ public class DirectoryFragment extends Fragment
            implements MultiSelectManager.Callback, ActionMode.Callback {

        private Selection mSelected = new Selection();
        private ActionMode mActionMode;
        private int mNoCopyCount = 0;
        private int mNoDeleteCount = 0;
        private int mNoRenameCount = -1;
@@ -578,10 +577,9 @@ public class DirectoryFragment extends Fragment
                    return true;

                case R.id.menu_delete:
                    // Pass mode along to the delete function so it can
                    // end action mode when documents are deleted.
                    // deleteDocuments will end action mode if the documents are deleted.
                    // It won't end action mode if user cancels the delete.
                    deleteDocuments(selection, mode);
                    deleteDocuments(selection);
                    return true;

                case R.id.menu_copy_to:
@@ -690,7 +688,7 @@ public class DirectoryFragment extends Fragment
        }.execute(selected);
    }

    private void deleteDocuments(final Selection selected, final ActionMode mode) {
    private void deleteDocuments(final Selection selected) {
        assert(!selected.isEmpty());

        final DocumentInfo srcParent = getDisplayState().stack.peek();
@@ -727,7 +725,9 @@ public class DirectoryFragment extends Fragment
                                // This is done here, rather in the onActionItemClicked
                                // so we can avoid de-selecting items in the case where
                                // the user cancels the delete.
                                mode.finish();
                                if (mActionMode != null) {
                                    mActionMode.finish();
                                }
                                // Hide the files in the UI...since the operation
                                // might be queued up on FileOperationService.
                                // We're walking a line here.
@@ -1272,6 +1272,16 @@ public class DirectoryFragment extends Fragment
                case KeyEvent.KEYCODE_DPAD_CENTER:
                case KeyEvent.KEYCODE_BUTTON_A:
                    return onActivate(doc);
                case KeyEvent.KEYCODE_FORWARD_DEL:
                    // This has to be handled here instead of in a keyboard shortcut, because
                    // keyboard shortcuts all have to be modified with the 'Ctrl' key.
                    if (mSelectionManager.hasSelection()) {
                        deleteDocuments(mSelectionManager.getSelection());
                    }
                    // Always handle the key, even if there was nothing to delete. This is a
                    // precaution to prevent other handlers from potentially picking up the event
                    // and triggering extra behaviours.
                    return true;
            }

            return false;