diff options
author | Ben Lin <linben@google.com> | 2016-06-21 13:28:17 -0700 |
---|---|---|
committer | Ben Lin <linben@google.com> | 2016-06-21 23:44:14 +0000 |
commit | 693ba32b7188c7fea6fdc20eace4b8ba8186060c (patch) | |
tree | 151b316dabdb69ba84358d6f78b137b1e0e7b093 /packages/DocumentsUI/src | |
parent | 1e4250df552beca869aa4dfa236e788c3e1103bf (diff) |
Fix context menu for empty directory/root view.
Since it's not always true that there is a doc/directory given the (x,
y) of the right click, I've changed the signature of right click to take
in a MotionEvent object as a parameter, and make a MotionInputEvent
inside the function as a check whether it's on a file/doc or on
empty/blank pane.
Bug: 29538570
Change-Id: I7ee960c9f556752bf314ab8cc2d94fda28194c0a
(cherry picked from commit 332192dee8cb99bd2e6ef638e78d5b62ab7ecfe6)
Diffstat (limited to 'packages/DocumentsUI/src')
-rw-r--r-- | packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java | 76 |
1 files changed, 43 insertions, 33 deletions
diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java index 8e9bf3e199f8..00f2885fb932 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java +++ b/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java @@ -417,37 +417,44 @@ public class DirectoryFragment extends Fragment return false; } - protected boolean onRightClick(MotionInputEvent e) { + protected boolean onRightClick(MotionEvent e) { // First get target to see if it's a blank window or a file/doc - DocumentHolder holder = getTarget(e); - if (holder != null) { - String modelId = getModelId(holder.itemView); - if (!mSelectionManager.getSelection().contains(modelId)) { - mSelectionManager.clearSelection(); - // Set selection on the one single item - List<String> ids = Collections.singletonList(modelId); - mSelectionManager.setItemsSelected(ids, true); - } - - // We are registering for context menu here so long-press doesn't trigger this - // floating context menu, and then quickly unregister right afterwards - registerForContextMenu(holder.itemView); - mRecView.showContextMenuForChild(holder.itemView, - e.getX() - holder.itemView.getLeft(), e.getY() - holder.itemView.getTop()); - unregisterForContextMenu(holder.itemView); - } - // If there was no holder item, that means user right-clicked on the blank pane - // We would want to show different options then, and not select any item - // The blank pane could be the recyclerView or the emptyView, so we need to register - // according to whichever one is visible - else if (mEmptyView.getVisibility() == View.VISIBLE) { - registerForContextMenu(mEmptyView); - mEmptyView.showContextMenu(e.getX(), e.getY()); - unregisterForContextMenu(mEmptyView); - } else { - registerForContextMenu(mRecView); - mRecView.showContextMenu(e.getX(), e.getY()); - unregisterForContextMenu(mRecView); + final MotionInputEvent event = MotionInputEvent.obtain(e, mRecView); + try { + if (event.getItemPosition() != RecyclerView.NO_POSITION) { + final DocumentHolder holder = getTarget(event); + String modelId = getModelId(holder.itemView); + if (!mSelectionManager.getSelection().contains(modelId)) { + mSelectionManager.clearSelection(); + // Set selection on the one single item + List<String> ids = Collections.singletonList(modelId); + mSelectionManager.setItemsSelected(ids, true); + } + + // We are registering for context menu here so long-press doesn't trigger this + // floating context menu, and then quickly unregister right afterwards + registerForContextMenu(holder.itemView); + mRecView.showContextMenuForChild(holder.itemView, + e.getX() - holder.itemView.getLeft(), e.getY() - holder.itemView.getTop()); + unregisterForContextMenu(holder.itemView); + } + // If there was no corresponding item pos, that means user right-clicked on the blank + // pane + // We would want to show different options then, and not select any item + // The blank pane could be the recyclerView or the emptyView, so we need to register + // according to whichever one is visible + else if (mEmptyView.getVisibility() == View.VISIBLE) { + registerForContextMenu(mEmptyView); + mEmptyView.showContextMenu(e.getX(), e.getY()); + unregisterForContextMenu(mEmptyView); + return true; + } else { + registerForContextMenu(mRecView); + mRecView.showContextMenu(e.getX(), e.getY()); + unregisterForContextMenu(mRecView); + } + } finally { + event.recycle(); } return true; } @@ -1638,7 +1645,7 @@ public class DirectoryFragment extends Fragment @Override public boolean onTouch(View v, MotionEvent event) { if (event.getButtonState() == MotionEvent.BUTTON_SECONDARY) { - return mGestureListener.onSingleTapConfirmed(event); + return mGestureListener.onRightClick(event); } return false; } @@ -1671,8 +1678,7 @@ public class DirectoryFragment extends Fragment // events. Otherwise, tap events are routed to the target DocumentHolder. if (Events.isMouseEvent(e) && mLastButtonState == MotionEvent.BUTTON_SECONDARY) { mLastButtonState = -1; - final MotionInputEvent event = MotionInputEvent.obtain(e, mRecView); - return DirectoryFragment.this.onRightClick(event); + return onRightClick(e); } final MotionInputEvent event = MotionInputEvent.obtain(e, mRecView); @@ -1714,6 +1720,10 @@ public class DirectoryFragment extends Fragment final MotionInputEvent event = MotionInputEvent.obtain(e, mRecView); return DirectoryFragment.this.onDoubleTap(event); } + + public boolean onRightClick(MotionEvent e) { + return DirectoryFragment.this.onRightClick(e); + } } public static void showDirectory( |