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;
+ }
}