summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Tomasz Mikolajewski <mtomasz@google.com> 2016-01-26 08:03:19 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2016-01-26 08:03:19 +0000
commit5eb8f9cc7001bf31f7c276e38a49393420b75055 (patch)
treee5b6233efdb56aba66942e019340527463ea25b9
parenta4d207cf649af273f25f5e1f6207fd71711d3610 (diff)
parentd46ecbcc5322cf817e64591e985f1f2a6167e9a7 (diff)
Merge "Add support for multi-parents to DocumentsProvider::moveDocument."
-rw-r--r--core/java/android/provider/DocumentsContract.java15
-rw-r--r--core/java/android/provider/DocumentsProvider.java17
-rw-r--r--packages/DocumentsUI/src/com/android/documentsui/services/MoveJob.java3
-rw-r--r--packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java3
4 files changed, 25 insertions, 13 deletions
diff --git a/core/java/android/provider/DocumentsContract.java b/core/java/android/provider/DocumentsContract.java
index 88cc8a2ae21a..414c60870641 100644
--- a/core/java/android/provider/DocumentsContract.java
+++ b/core/java/android/provider/DocumentsContract.java
@@ -342,8 +342,8 @@ public final class DocumentsContract {
* within the same document provider.
*
* @see #COLUMN_FLAGS
- * @see DocumentsContract#moveDocument(ContentProviderClient, Uri, Uri)
- * @see DocumentsProvider#moveDocument(String, String)
+ * @see DocumentsContract#moveDocument(ContentProviderClient, Uri, Uri, Uri)
+ * @see DocumentsProvider#moveDocument(String, String, String)
*/
public static final int FLAG_SUPPORTS_MOVE = 1 << 8;
@@ -614,6 +614,8 @@ public final class DocumentsContract {
public static final String METHOD_IS_CHILD_DOCUMENT = "android:isChildDocument";
/** {@hide} */
+ public static final String EXTRA_PARENT_URI = "parentUri";
+ /** {@hide} */
public static final String EXTRA_URI = "uri";
private static final String PATH_ROOT = "root";
@@ -1170,17 +1172,19 @@ public final class DocumentsContract {
* Moves the given document under a new parent.
*
* @param sourceDocumentUri document with {@link Document#FLAG_SUPPORTS_MOVE}
+ * @param sourceParentDocumentUri parent document of the document to move.
* @param targetParentDocumentUri document which will become a new parent of the source
* document.
* @return the moved document, or {@code null} if failed.
* @hide
*/
public static Uri moveDocument(ContentResolver resolver, Uri sourceDocumentUri,
- Uri targetParentDocumentUri) {
+ Uri sourceParentDocumentUri, Uri targetParentDocumentUri) {
final ContentProviderClient client = resolver.acquireUnstableContentProviderClient(
sourceDocumentUri.getAuthority());
try {
- return moveDocument(client, sourceDocumentUri, targetParentDocumentUri);
+ return moveDocument(client, sourceParentDocumentUri, sourceDocumentUri,
+ targetParentDocumentUri);
} catch (Exception e) {
Log.w(TAG, "Failed to move document", e);
return null;
@@ -1191,9 +1195,10 @@ public final class DocumentsContract {
/** {@hide} */
public static Uri moveDocument(ContentProviderClient client, Uri sourceDocumentUri,
- Uri targetParentDocumentUri) throws RemoteException {
+ Uri sourceParentDocumentUri, Uri targetParentDocumentUri) throws RemoteException {
final Bundle in = new Bundle();
in.putParcelable(DocumentsContract.EXTRA_URI, sourceDocumentUri);
+ in.putParcelable(DocumentsContract.EXTRA_PARENT_URI, sourceParentDocumentUri);
in.putParcelable(DocumentsContract.EXTRA_TARGET_URI, targetParentDocumentUri);
final Bundle out = client.call(METHOD_MOVE_DOCUMENT, null, in);
diff --git a/core/java/android/provider/DocumentsProvider.java b/core/java/android/provider/DocumentsProvider.java
index 94b41575d0a3..bae928d1755d 100644
--- a/core/java/android/provider/DocumentsProvider.java
+++ b/core/java/android/provider/DocumentsProvider.java
@@ -289,12 +289,14 @@ public abstract class DocumentsProvider extends ContentProvider {
* be returned.
*
* @param sourceDocumentId the document to move.
+ * @param sourceParentDocumentId the parent of the document to move.
* @param targetParentDocumentId the target document to be a new parent of the
* source document.
* @hide
*/
@SuppressWarnings("unused")
- public String moveDocument(String sourceDocumentId, String targetParentDocumentId)
+ public String moveDocument(String sourceDocumentId, String sourceParentDocumentId,
+ String targetParentDocumentId)
throws FileNotFoundException {
throw new UnsupportedOperationException("Move not supported");
}
@@ -759,7 +761,7 @@ public abstract class DocumentsProvider extends ContentProvider {
out.putParcelable(DocumentsContract.EXTRA_URI, newDocumentUri);
- // Original document no longer exists, clean up any grants
+ // Original document no longer exists, clean up any grants.
revokeDocumentPermission(documentId);
}
@@ -767,7 +769,7 @@ public abstract class DocumentsProvider extends ContentProvider {
enforceWritePermissionInner(documentUri, getCallingPackage(), null);
deleteDocument(documentId);
- // Document no longer exists, clean up any grants
+ // Document no longer exists, clean up any grants.
revokeDocumentPermission(documentId);
} else if (METHOD_COPY_DOCUMENT.equals(method)) {
@@ -793,13 +795,16 @@ public abstract class DocumentsProvider extends ContentProvider {
}
} else if (METHOD_MOVE_DOCUMENT.equals(method)) {
+ final Uri parentSourceUri = extras.getParcelable(DocumentsContract.EXTRA_PARENT_URI);
+ final String parentSourceId = DocumentsContract.getDocumentId(parentSourceUri);
final Uri targetUri = extras.getParcelable(DocumentsContract.EXTRA_TARGET_URI);
final String targetId = DocumentsContract.getDocumentId(targetUri);
- enforceReadPermissionInner(documentUri, getCallingPackage(), null);
+ enforceWritePermissionInner(documentUri, getCallingPackage(), null);
+ enforceReadPermissionInner(parentSourceUri, getCallingPackage(), null);
enforceWritePermissionInner(targetUri, getCallingPackage(), null);
- final String newDocumentId = moveDocument(documentId, targetId);
+ final String newDocumentId = moveDocument(documentId, parentSourceId, targetId);
if (newDocumentId != null) {
final Uri newDocumentUri = buildDocumentUriMaybeUsingTree(documentUri,
@@ -814,7 +819,7 @@ public abstract class DocumentsProvider extends ContentProvider {
out.putParcelable(DocumentsContract.EXTRA_URI, newDocumentUri);
}
- // Original document no longer exists, clean up any grants
+ // Original document no longer exists, clean up any grants.
revokeDocumentPermission(documentId);
} else {
diff --git a/packages/DocumentsUI/src/com/android/documentsui/services/MoveJob.java b/packages/DocumentsUI/src/com/android/documentsui/services/MoveJob.java
index 7a238bd6ce7d..2a0262c29783 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/services/MoveJob.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/services/MoveJob.java
@@ -21,6 +21,7 @@ import static com.android.documentsui.services.FileOperationService.OPERATION_MO
import android.app.Notification;
import android.app.Notification.Builder;
import android.content.Context;
+import android.net.Uri;
import android.os.RemoteException;
import android.provider.DocumentsContract;
import android.provider.DocumentsContract.Document;
@@ -85,7 +86,7 @@ final class MoveJob extends CopyJob {
if (src.authority.equals(dest.authority)) {
if ((src.flags & Document.FLAG_SUPPORTS_MOVE) != 0) {
if (DocumentsContract.moveDocument(getClient(src), src.derivedUri,
- dest.derivedUri) == null) {
+ Uri.EMPTY /* Not used yet */, dest.derivedUri) == null) {
onFileFailed(src);
return false;
}
diff --git a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java
index c6e55314770a..43527a23539c 100644
--- a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java
+++ b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java
@@ -463,7 +463,8 @@ public class ExternalStorageProvider extends DocumentsProvider {
}
@Override
- public String moveDocument(String sourceDocumentId, String targetParentDocumentId)
+ public String moveDocument(String sourceDocumentId, String sourceParentDocumentId,
+ String targetParentDocumentId)
throws FileNotFoundException {
final File before = getFileForDocId(sourceDocumentId);
final File after = new File(getFileForDocId(targetParentDocumentId), before.getName());