Add a move feature to DocumentsUI.

Add a menu item (protected behind a system property) for moving files.
Add an extra to the copy intent for transfer mode (copy/move).
Add code to CopyService to delete files after copy when in move mode.
Add tests.

BUG=20559838

Change-Id: I983f57a528327d1e7a12982b599094aad2c856ed
diff --git a/src/com/android/documentsui/DirectoryFragment.java b/src/com/android/documentsui/DirectoryFragment.java
index 7d737ca..05dd16c 100644
--- a/src/com/android/documentsui/DirectoryFragment.java
+++ b/src/com/android/documentsui/DirectoryFragment.java
@@ -28,6 +28,7 @@
 import static com.android.documentsui.model.DocumentInfo.getCursorInt;
 import static com.android.documentsui.model.DocumentInfo.getCursorLong;
 import static com.android.documentsui.model.DocumentInfo.getCursorString;
+
 import android.app.Activity;
 import android.app.ActivityManager;
 import android.app.Fragment;
@@ -53,6 +54,7 @@
 import android.os.CancellationSignal;
 import android.os.OperationCanceledException;
 import android.os.Parcelable;
+import android.os.SystemProperties;
 import android.provider.DocumentsContract;
 import android.provider.DocumentsContract.Document;
 import android.text.format.DateUtils;
@@ -355,7 +357,8 @@
         }
 
         CopyService.start(getActivity(), getDisplayState(this).selectedDocumentsForCopy,
-                (DocumentStack) data.getParcelableExtra(CopyService.EXTRA_STACK));
+                (DocumentStack) data.getParcelableExtra(CopyService.EXTRA_STACK),
+                data.getIntExtra(CopyService.EXTRA_TRANSFER_MODE, CopyService.TRANSFER_MODE_NONE));
     }
 
     @Override
@@ -488,6 +491,7 @@
             final MenuItem share = menu.findItem(R.id.menu_share);
             final MenuItem delete = menu.findItem(R.id.menu_delete);
             final MenuItem copy = menu.findItem(R.id.menu_copy);
+            final MenuItem move = menu.findItem(R.id.menu_move);
 
             final boolean manageOrBrowse = (state.action == ACTION_MANAGE
                     || state.action == ACTION_BROWSE || state.action == ACTION_BROWSE_ALL);
@@ -497,7 +501,7 @@
             delete.setVisible(manageOrBrowse);
             // Disable copying from the Recents view.
             copy.setVisible(manageOrBrowse && mType != TYPE_RECENT_OPEN);
-
+            move.setVisible(SystemProperties.getBoolean("debug.documentsui.enable_move", false));
             return true;
         }
 
@@ -522,7 +526,12 @@
                 return true;
 
             } else if (id == R.id.menu_copy) {
-                onCopyDocuments(docs);
+                onTransferDocuments(docs, CopyService.TRANSFER_MODE_COPY);
+                mode.finish();
+                return true;
+
+            } else if (id == R.id.menu_move) {
+                onTransferDocuments(docs, CopyService.TRANSFER_MODE_MOVE);
                 mode.finish();
                 return true;
 
@@ -655,7 +664,7 @@
         }
     }
 
-    private void onCopyDocuments(List<DocumentInfo> docs) {
+    private void onTransferDocuments(List<DocumentInfo> docs, int mode) {
         getDisplayState(this).selectedDocumentsForCopy = docs;
 
         // Pop up a dialog to pick a destination.  This is inadequate but works for now.
@@ -673,6 +682,7 @@
             }
         }
         intent.putExtra(BaseActivity.DocumentsIntent.EXTRA_DIRECTORY_COPY, directoryCopy);
+        intent.putExtra(CopyService.EXTRA_TRANSFER_MODE, mode);
         startActivityForResult(intent, REQUEST_COPY_DESTINATION);
     }
 
@@ -1220,7 +1230,7 @@
             tmpStack = curStack;
         }
 
-        CopyService.start(getActivity(), srcDocs, tmpStack);
+        CopyService.start(getActivity(), srcDocs, tmpStack, CopyService.TRANSFER_MODE_COPY);
     }
 
     private List<DocumentInfo> getDocumentsFromClipData(ClipData clipData) {