Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5eb8f9cc authored by Tomasz Mikolajewski's avatar Tomasz Mikolajewski Committed by Android (Google) Code Review
Browse files

Merge "Add support for multi-parents to DocumentsProvider::moveDocument."

parents a4d207cf d46ecbcc
Loading
Loading
Loading
Loading
+10 −5
Original line number Original line Diff line number Diff line
@@ -342,8 +342,8 @@ public final class DocumentsContract {
         * within the same document provider.
         * within the same document provider.
         *
         *
         * @see #COLUMN_FLAGS
         * @see #COLUMN_FLAGS
         * @see DocumentsContract#moveDocument(ContentProviderClient, Uri, Uri)
         * @see DocumentsContract#moveDocument(ContentProviderClient, Uri, Uri, Uri)
         * @see DocumentsProvider#moveDocument(String, String)
         * @see DocumentsProvider#moveDocument(String, String, String)
         */
         */
        public static final int FLAG_SUPPORTS_MOVE = 1 << 8;
        public static final int FLAG_SUPPORTS_MOVE = 1 << 8;


@@ -613,6 +613,8 @@ public final class DocumentsContract {
    /** {@hide} */
    /** {@hide} */
    public static final String METHOD_IS_CHILD_DOCUMENT = "android:isChildDocument";
    public static final String METHOD_IS_CHILD_DOCUMENT = "android:isChildDocument";


    /** {@hide} */
    public static final String EXTRA_PARENT_URI = "parentUri";
    /** {@hide} */
    /** {@hide} */
    public static final String EXTRA_URI = "uri";
    public static final String EXTRA_URI = "uri";


@@ -1170,17 +1172,19 @@ public final class DocumentsContract {
     * Moves the given document under a new parent.
     * Moves the given document under a new parent.
     *
     *
     * @param sourceDocumentUri document with {@link Document#FLAG_SUPPORTS_MOVE}
     * @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
     * @param targetParentDocumentUri document which will become a new parent of the source
     *         document.
     *         document.
     * @return the moved document, or {@code null} if failed.
     * @return the moved document, or {@code null} if failed.
     * @hide
     * @hide
     */
     */
    public static Uri moveDocument(ContentResolver resolver, Uri sourceDocumentUri,
    public static Uri moveDocument(ContentResolver resolver, Uri sourceDocumentUri,
            Uri targetParentDocumentUri) {
            Uri sourceParentDocumentUri, Uri targetParentDocumentUri) {
        final ContentProviderClient client = resolver.acquireUnstableContentProviderClient(
        final ContentProviderClient client = resolver.acquireUnstableContentProviderClient(
                sourceDocumentUri.getAuthority());
                sourceDocumentUri.getAuthority());
        try {
        try {
            return moveDocument(client, sourceDocumentUri, targetParentDocumentUri);
            return moveDocument(client, sourceParentDocumentUri, sourceDocumentUri,
                    targetParentDocumentUri);
        } catch (Exception e) {
        } catch (Exception e) {
            Log.w(TAG, "Failed to move document", e);
            Log.w(TAG, "Failed to move document", e);
            return null;
            return null;
@@ -1191,9 +1195,10 @@ public final class DocumentsContract {


    /** {@hide} */
    /** {@hide} */
    public static Uri moveDocument(ContentProviderClient client, Uri sourceDocumentUri,
    public static Uri moveDocument(ContentProviderClient client, Uri sourceDocumentUri,
            Uri targetParentDocumentUri) throws RemoteException {
            Uri sourceParentDocumentUri, Uri targetParentDocumentUri) throws RemoteException {
        final Bundle in = new Bundle();
        final Bundle in = new Bundle();
        in.putParcelable(DocumentsContract.EXTRA_URI, sourceDocumentUri);
        in.putParcelable(DocumentsContract.EXTRA_URI, sourceDocumentUri);
        in.putParcelable(DocumentsContract.EXTRA_PARENT_URI, sourceParentDocumentUri);
        in.putParcelable(DocumentsContract.EXTRA_TARGET_URI, targetParentDocumentUri);
        in.putParcelable(DocumentsContract.EXTRA_TARGET_URI, targetParentDocumentUri);


        final Bundle out = client.call(METHOD_MOVE_DOCUMENT, null, in);
        final Bundle out = client.call(METHOD_MOVE_DOCUMENT, null, in);
+11 −6
Original line number Original line Diff line number Diff line
@@ -289,12 +289,14 @@ public abstract class DocumentsProvider extends ContentProvider {
     * be returned.
     * be returned.
     *
     *
     * @param sourceDocumentId the document to move.
     * @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
     * @param targetParentDocumentId the target document to be a new parent of the
     *     source document.
     *     source document.
     * @hide
     * @hide
     */
     */
    @SuppressWarnings("unused")
    @SuppressWarnings("unused")
    public String moveDocument(String sourceDocumentId, String targetParentDocumentId)
    public String moveDocument(String sourceDocumentId, String sourceParentDocumentId,
            String targetParentDocumentId)
            throws FileNotFoundException {
            throws FileNotFoundException {
        throw new UnsupportedOperationException("Move not supported");
        throw new UnsupportedOperationException("Move not supported");
    }
    }
@@ -759,7 +761,7 @@ public abstract class DocumentsProvider extends ContentProvider {


                out.putParcelable(DocumentsContract.EXTRA_URI, newDocumentUri);
                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);
                revokeDocumentPermission(documentId);
            }
            }


@@ -767,7 +769,7 @@ public abstract class DocumentsProvider extends ContentProvider {
            enforceWritePermissionInner(documentUri, getCallingPackage(), null);
            enforceWritePermissionInner(documentUri, getCallingPackage(), null);
            deleteDocument(documentId);
            deleteDocument(documentId);


            // Document no longer exists, clean up any grants
            // Document no longer exists, clean up any grants.
            revokeDocumentPermission(documentId);
            revokeDocumentPermission(documentId);


        } else if (METHOD_COPY_DOCUMENT.equals(method)) {
        } else if (METHOD_COPY_DOCUMENT.equals(method)) {
@@ -793,13 +795,16 @@ public abstract class DocumentsProvider extends ContentProvider {
            }
            }


        } else if (METHOD_MOVE_DOCUMENT.equals(method)) {
        } 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 Uri targetUri = extras.getParcelable(DocumentsContract.EXTRA_TARGET_URI);
            final String targetId = DocumentsContract.getDocumentId(targetUri);
            final String targetId = DocumentsContract.getDocumentId(targetUri);


            enforceReadPermissionInner(documentUri, getCallingPackage(), null);
            enforceWritePermissionInner(documentUri, getCallingPackage(), null);
            enforceReadPermissionInner(parentSourceUri, getCallingPackage(), null);
            enforceWritePermissionInner(targetUri, getCallingPackage(), null);
            enforceWritePermissionInner(targetUri, getCallingPackage(), null);


            final String newDocumentId = moveDocument(documentId, targetId);
            final String newDocumentId = moveDocument(documentId, parentSourceId, targetId);


            if (newDocumentId != null) {
            if (newDocumentId != null) {
                final Uri newDocumentUri = buildDocumentUriMaybeUsingTree(documentUri,
                final Uri newDocumentUri = buildDocumentUriMaybeUsingTree(documentUri,
@@ -814,7 +819,7 @@ public abstract class DocumentsProvider extends ContentProvider {
                out.putParcelable(DocumentsContract.EXTRA_URI, newDocumentUri);
                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);
            revokeDocumentPermission(documentId);


        } else {
        } else {
+2 −1
Original line number Original line Diff line number Diff line
@@ -21,6 +21,7 @@ import static com.android.documentsui.services.FileOperationService.OPERATION_MO
import android.app.Notification;
import android.app.Notification;
import android.app.Notification.Builder;
import android.app.Notification.Builder;
import android.content.Context;
import android.content.Context;
import android.net.Uri;
import android.os.RemoteException;
import android.os.RemoteException;
import android.provider.DocumentsContract;
import android.provider.DocumentsContract;
import android.provider.DocumentsContract.Document;
import android.provider.DocumentsContract.Document;
@@ -85,7 +86,7 @@ final class MoveJob extends CopyJob {
        if (src.authority.equals(dest.authority)) {
        if (src.authority.equals(dest.authority)) {
            if ((src.flags & Document.FLAG_SUPPORTS_MOVE) != 0) {
            if ((src.flags & Document.FLAG_SUPPORTS_MOVE) != 0) {
                if (DocumentsContract.moveDocument(getClient(src), src.derivedUri,
                if (DocumentsContract.moveDocument(getClient(src), src.derivedUri,
                        dest.derivedUri) == null) {
                        Uri.EMPTY /* Not used yet */, dest.derivedUri) == null) {
                    onFileFailed(src);
                    onFileFailed(src);
                    return false;
                    return false;
                }
                }
+2 −1
Original line number Original line Diff line number Diff line
@@ -463,7 +463,8 @@ public class ExternalStorageProvider extends DocumentsProvider {
    }
    }


    @Override
    @Override
    public String moveDocument(String sourceDocumentId, String targetParentDocumentId)
    public String moveDocument(String sourceDocumentId, String sourceParentDocumentId,
            String targetParentDocumentId)
            throws FileNotFoundException {
            throws FileNotFoundException {
        final File before = getFileForDocId(sourceDocumentId);
        final File before = getFileForDocId(sourceDocumentId);
        final File after = new File(getFileForDocId(targetParentDocumentId), before.getName());
        final File after = new File(getFileForDocId(targetParentDocumentId), before.getName());