Apply hirono@'s logic for disabling delete action
...when selection contains non-deletable items.
BUG=22441292
Change-Id: I716e5c1f685c9f3d12b01b193753775094cde481
diff --git a/src/com/android/documentsui/DirectoryFragment.java b/src/com/android/documentsui/DirectoryFragment.java
index 0554601..3e1bc1a 100644
--- a/src/com/android/documentsui/DirectoryFragment.java
+++ b/src/com/android/documentsui/DirectoryFragment.java
@@ -65,7 +65,6 @@
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.LayoutManager;
-import android.support.v7.widget.RecyclerView.OnItemTouchListener;
import android.support.v7.widget.RecyclerView.RecyclerListener;
import android.support.v7.widget.RecyclerView.ViewHolder;
import android.text.TextUtils;
@@ -83,7 +82,6 @@
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
-import android.view.ViewParent;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
@@ -544,6 +542,8 @@
private Selection mSelected = new Selection();
private ActionMode mActionMode;
+ private int mNoDeleteCount = 0;
+ private Menu mMenu;
@Override
public boolean onBeforeItemStateChange(int position, boolean selected) {
@@ -560,18 +560,28 @@
@Override
public void onItemStateChanged(int position, boolean selected) {
+
+ final Cursor cursor = mAdapter.getItem(position);
+ checkNotNull(cursor, "Cursor cannot be null.");
+
+ final int docFlags = getCursorInt(cursor, Document.COLUMN_FLAGS);
+ if ((docFlags & Document.FLAG_SUPPORTS_DELETE) == 0) {
+ mNoDeleteCount += selected ? 1 : -1;
+ }
+
mSelectionManager.getSelection(mSelected);
- if (mSelected.size() == 0) {
- if (DEBUG) Log.d(TAG, "Finishing action mode.");
- if (mActionMode != null) {
- mActionMode.finish();
- }
- } else {
+ if (mSelected.size() > 0) {
if (DEBUG) Log.d(TAG, "Maybe starting action mode.");
if (mActionMode == null) {
if (DEBUG) Log.d(TAG, "Yeah. Starting action mode.");
mActionMode = getActivity().startActionMode(this);
}
+ updateActionMenu();
+ } else {
+ if (DEBUG) Log.d(TAG, "Finishing action mode.");
+ if (mActionMode != null) {
+ mActionMode.finish();
+ }
}
if (mActionMode != null) {
@@ -586,6 +596,8 @@
mActionMode = null;
// clear selection
mSelectionManager.clearSelection();
+ mSelected.clear();
+ mNoDeleteCount = 0;
}
@Override
@@ -597,12 +609,17 @@
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
- // Delegate update logic to our owning action, since specialized
- // logic is desired.
- mFragmentTuner.updateActionMenu(menu, mType);
+ mMenu = menu;
+ updateActionMenu();
return true;
}
+ private void updateActionMenu() {
+ checkNotNull(mMenu);
+ // Delegate update logic to our owning action, since specialized logic is desired.
+ mFragmentTuner.updateActionMenu(mMenu, mType, mNoDeleteCount == 0);
+ }
+
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
@@ -1608,7 +1625,7 @@
* Feel free to expand the role of this class to handle other specializations.
*/
private interface FragmentTuner {
- void updateActionMenu(Menu menu, int dirType);
+ void updateActionMenu(Menu menu, int dirType, boolean canDelete);
}
/**
@@ -1643,7 +1660,7 @@
}
@Override
- public void updateActionMenu(Menu menu, int dirType) {
+ public void updateActionMenu(Menu menu, int dirType, boolean canDelete) {
Preconditions.checkState(mState.action != ACTION_BROWSE_ALL);
final MenuItem open = menu.findItem(R.id.menu_open);
@@ -1658,7 +1675,7 @@
open.setVisible(!manageOrBrowse);
share.setVisible(manageOrBrowse);
- delete.setVisible(manageOrBrowse);
+ delete.setVisible(manageOrBrowse && canDelete);
// Disable copying from the Recents view.
copyTo.setVisible(manageOrBrowse && dirType != TYPE_RECENT_OPEN);
moveTo.setVisible(SystemProperties.getBoolean("debug.documentsui.enable_move", false));
@@ -1673,9 +1690,9 @@
*/
private static final class StandaloneTuner implements FragmentTuner {
@Override
- public void updateActionMenu(Menu menu, int dirType) {
+ public void updateActionMenu(Menu menu, int dirType, boolean canDelete) {
menu.findItem(R.id.menu_share).setVisible(true);
- menu.findItem(R.id.menu_delete).setVisible(true);
+ menu.findItem(R.id.menu_delete).setVisible(canDelete);
menu.findItem(R.id.menu_copy_to_clipboard).setVisible(true);
menu.findItem(R.id.menu_open).setVisible(false);