Add ClipData manipulation methods to DirectoryFragment.

These will be used in drag&drop and copy/paste implementations.

Bug:20556237
Change-Id: I5a48cd5671bb74d233569ff9732b310cc2036f27
diff --git a/src/com/android/documentsui/DirectoryFragment.java b/src/com/android/documentsui/DirectoryFragment.java
index a789da8..7d737ca 100644
--- a/src/com/android/documentsui/DirectoryFragment.java
+++ b/src/com/android/documentsui/DirectoryFragment.java
@@ -34,6 +34,7 @@
 import android.app.FragmentManager;
 import android.app.FragmentTransaction;
 import android.app.LoaderManager.LoaderCallbacks;
+import android.content.ClipData;
 import android.content.ContentProviderClient;
 import android.content.ContentResolver;
 import android.content.ContentValues;
@@ -502,16 +503,7 @@
 
         @Override
         public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
-            final SparseBooleanArray checked = mCurrentView.getCheckedItemPositions();
-            final ArrayList<DocumentInfo> docs = Lists.newArrayList();
-            final int size = checked.size();
-            for (int i = 0; i < size; i++) {
-                if (checked.valueAt(i)) {
-                    final Cursor cursor = mAdapter.getItem(checked.keyAt(i));
-                    final DocumentInfo doc = DocumentInfo.fromDirectoryCursor(cursor);
-                    docs.add(doc);
-                }
-            }
+            final List<DocumentInfo> docs = getSelectedDocuments();
 
             final int id = item.getItemId();
             if (id == R.id.menu_open) {
@@ -1198,4 +1190,76 @@
 
         return MimePredicate.mimeMatches(state.acceptMimes, docMimeType);
     }
+
+    public List<DocumentInfo> getSelectedDocuments() {
+        final SparseBooleanArray checked = mCurrentView.getCheckedItemPositions();
+        final List<DocumentInfo> docs = Lists.newArrayList();
+        final int size = checked.size();
+        for (int i = 0; i < size; i++) {
+            if (checked.valueAt(i)) {
+                final Cursor cursor = mAdapter.getItem(checked.keyAt(i));
+                final DocumentInfo doc = DocumentInfo.fromDirectoryCursor(cursor);
+                docs.add(doc);
+            }
+        }
+        return docs;
+    }
+
+    private void copyFromClipData(ClipData clipData, DocumentInfo dstDir) {
+        final List<DocumentInfo> srcDocs = getDocumentsFromClipData(clipData);
+
+        if (srcDocs.isEmpty())
+            return;
+
+        final DocumentStack curStack = getDisplayState(this).stack;
+        DocumentStack tmpStack = new DocumentStack();
+        if (dstDir != null) {
+            tmpStack.push(dstDir);
+            tmpStack.addAll(curStack);
+        } else {
+            tmpStack = curStack;
+        }
+
+        CopyService.start(getActivity(), srcDocs, tmpStack);
+    }
+
+    private List<DocumentInfo> getDocumentsFromClipData(ClipData clipData) {
+        final List<DocumentInfo> srcDocs = Lists.newArrayList();
+
+        Context context = getActivity();
+        final ContentResolver resolver = context.getContentResolver();
+
+        int itemCount = clipData.getItemCount();
+        for (int i = 0; i < itemCount; ++i) {
+            ClipData.Item item = clipData.getItemAt(i);
+            Uri itemUri = item.getUri();
+            if (itemUri != null && DocumentsContract.isDocumentUri(context, itemUri)) {
+                try {
+                    Cursor cursor = resolver.query(itemUri, null, null, null, null);
+                    cursor.moveToPosition(0);
+                    srcDocs.add(DocumentInfo.fromCursor(cursor, itemUri.getAuthority()));
+                } catch (Exception e) {
+                    Log.e(TAG, e.getMessage());
+                }
+            }
+        }
+
+        return srcDocs;
+    }
+
+    private ClipData getClipDataFromDocuments(List<DocumentInfo> docs) {
+        Context context = getActivity();
+        final ContentResolver resolver = context.getContentResolver();
+        ClipData clipData = null;
+        for (DocumentInfo doc : docs) {
+            final Uri uri = DocumentsContract.buildDocumentUri(doc.authority, doc.documentId);
+            if (clipData == null) {
+                clipData = ClipData.newUri(resolver, "", uri);
+            } else {
+                // TODO: update list of mime types in ClipData.
+                clipData.addItem(new ClipData.Item(uri));
+            }
+        }
+        return clipData;
+    }
 }