Do not allow to select non-selectable items via mouse.
Bug: 28101625
Change-Id: I9f6cd4e259f7860bbc6c74c4d24c43e2c3ba1047
diff --git a/src/com/android/documentsui/dirlist/MultiSelectManager.java b/src/com/android/documentsui/dirlist/MultiSelectManager.java
index 7588153..35d8988 100644
--- a/src/com/android/documentsui/dirlist/MultiSelectManager.java
+++ b/src/com/android/documentsui/dirlist/MultiSelectManager.java
@@ -1268,6 +1268,11 @@
notifySelectionChanged();
}
+ @Override
+ public boolean onBeforeItemStateChange(String id, boolean nextState) {
+ return notifyBeforeItemStateChange(id, nextState);
+ }
+
private class ViewScroller implements Runnable {
/**
* The number of milliseconds of scrolling at which scroll speed continues to increase.
@@ -1655,7 +1660,9 @@
if (id != null) {
// The adapter inserts items for UI layout purposes that aren't associated
// with files. Those will have a null model ID. Don't select them.
- mSelection.add(id);
+ if (canSelect(id)) {
+ mSelection.add(id);
+ }
}
if (isPossiblePositionNearestOrigin(column, columnStartIndex, columnEndIndex,
row, rowStartIndex, rowEndIndex)) {
@@ -1669,6 +1676,21 @@
}
/**
+ * @return True if the item is selectable.
+ */
+ private boolean canSelect(String id) {
+ // TODO: Simplify the logic, so the check whether we can select is done in one place.
+ // Consider injecting FragmentTuner, or move the checks from MultiSelectManager to
+ // Selection.
+ for (OnSelectionChangedListener listener : mOnSelectionChangedListeners) {
+ if (!listener.onBeforeItemStateChange(id, true)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
* @return Returns true if the position is the nearest to the origin, or, in the case of the
* lower-right corner, whether it is possible that the position is the nearest to the
* origin. See comment below for reasoning for this special case.
@@ -1700,6 +1722,7 @@
*/
static interface OnSelectionChangedListener {
public void onSelectionChanged(Set<String> updatedSelection);
+ public boolean onBeforeItemStateChange(String id, boolean nextState);
}
void addOnSelectionChangedListener(OnSelectionChangedListener listener) {
diff --git a/tests/src/com/android/documentsui/dirlist/MultiSelectManager_GridModelTest.java b/tests/src/com/android/documentsui/dirlist/MultiSelectManager_GridModelTest.java
index 0c0e0b7..cc119fe 100644
--- a/tests/src/com/android/documentsui/dirlist/MultiSelectManager_GridModelTest.java
+++ b/tests/src/com/android/documentsui/dirlist/MultiSelectManager_GridModelTest.java
@@ -76,6 +76,11 @@
public void onSelectionChanged(Set<String> updatedSelection) {
lastSelection = updatedSelection;
}
+
+ @Override
+ public boolean onBeforeItemStateChange(String id, boolean nextState) {
+ return true;
+ }
});
}