Merge "Crash fixes for Gesture selection in Picker mode." into nyc-andromeda-dev
diff --git a/src/com/android/documentsui/base/EventHandler.java b/src/com/android/documentsui/base/EventHandler.java
index c0667b6..93e575d 100644
--- a/src/com/android/documentsui/base/EventHandler.java
+++ b/src/com/android/documentsui/base/EventHandler.java
@@ -23,4 +23,22 @@
 @FunctionalInterface
 public interface EventHandler<T> {
     boolean accept(T event);
+
+    public static <T> EventHandler<T> createStub(boolean reply) {
+        return new Stub<T>(reply);
+    }
+
+    public static final class Stub<T> implements EventHandler<T> {
+
+        private boolean mReply;
+
+        private Stub(boolean reply) {
+            mReply = reply;}
+
+        @Override
+        public boolean accept(T event) {
+            return mReply;
+        }
+
+    }
 }
\ No newline at end of file
diff --git a/src/com/android/documentsui/dirlist/DirectoryFragment.java b/src/com/android/documentsui/dirlist/DirectoryFragment.java
index 1d29ba8..74b41fc 100644
--- a/src/com/android/documentsui/dirlist/DirectoryFragment.java
+++ b/src/com/android/documentsui/dirlist/DirectoryFragment.java
@@ -77,6 +77,7 @@
 import com.android.documentsui.Snackbars;
 import com.android.documentsui.ThumbnailCache;
 import com.android.documentsui.base.DocumentInfo;
+import com.android.documentsui.base.EventHandler;
 import com.android.documentsui.base.EventListener;
 import com.android.documentsui.base.Events.InputEvent;
 import com.android.documentsui.base.Events.MotionInputEvent;
@@ -318,6 +319,9 @@
                         getContext().getDrawable(com.android.internal.R.drawable.ic_doc_generic))
                 : DragStartListener.DUMMY;
 
+        EventHandler<InputEvent> gestureHandler = state.allowMultiple
+                ? gestureSel::start
+                : EventHandler.createStub(false);
         mInputHandler = new UserInputHandler<>(
                 mSelectionMgr,
                 mFocusManager,
@@ -331,7 +335,7 @@
                 (DocumentDetails details) -> mTuner.onDocumentPicked(details.getModelId()),
                 (DocumentDetails ignored) -> onDeleteSelectedDocuments(), // delete handler
                 mDragStartListener::onTouchDragEvent,
-                gestureSel::start);
+                gestureHandler);
 
         new ListeningGestureDetector(
                 this.getContext(),
diff --git a/src/com/android/documentsui/dirlist/UserInputHandler.java b/src/com/android/documentsui/dirlist/UserInputHandler.java
index 9db6599..b03247f 100644
--- a/src/com/android/documentsui/dirlist/UserInputHandler.java
+++ b/src/com/android/documentsui/dirlist/UserInputHandler.java
@@ -279,7 +279,11 @@
             } else {
                 if (!mSelectionMgr.getSelection().contains(doc.getModelId())) {
                     selectDocument(doc);
-                    mGestureSelectHandler.accept(event);
+                    // If we cannot select it, we didn't apply anchoring - therefore should not
+                    // start gesture selection
+                    if (mSelectable.test(doc)) {
+                        mGestureSelectHandler.accept(event);
+                    }
                 } else {
                     // We only initiate drag and drop on long press for touch to allow regular
                     // touch-based scrolling