From eb61aac503a3bd8b5c9986f96fd2334382449b0a Mon Sep 17 00:00:00 2001 From: Ben Kwa Date: Mon, 14 Mar 2016 15:12:12 -0700 Subject: [PATCH] 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 --- .../dirlist/DirectoryFragment.java | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java index ae746b6512567..0e3b01f23700e 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java +++ b/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java @@ -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;