Loading core/java/android/provider/DocumentsContract.java +10 −5 Original line number Original line Diff line number Diff line Loading @@ -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; Loading Loading @@ -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"; Loading Loading @@ -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; Loading @@ -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); Loading core/java/android/provider/DocumentsProvider.java +11 −6 Original line number Original line Diff line number Diff line Loading @@ -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"); } } Loading Loading @@ -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); } } Loading @@ -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)) { Loading @@ -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, Loading @@ -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 { Loading packages/DocumentsUI/src/com/android/documentsui/services/MoveJob.java +2 −1 Original line number Original line Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; } } Loading packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java +2 −1 Original line number Original line Diff line number Diff line Loading @@ -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()); Loading Loading
core/java/android/provider/DocumentsContract.java +10 −5 Original line number Original line Diff line number Diff line Loading @@ -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; Loading Loading @@ -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"; Loading Loading @@ -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; Loading @@ -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); Loading
core/java/android/provider/DocumentsProvider.java +11 −6 Original line number Original line Diff line number Diff line Loading @@ -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"); } } Loading Loading @@ -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); } } Loading @@ -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)) { Loading @@ -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, Loading @@ -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 { Loading
packages/DocumentsUI/src/com/android/documentsui/services/MoveJob.java +2 −1 Original line number Original line Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; } } Loading
packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java +2 −1 Original line number Original line Diff line number Diff line Loading @@ -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()); Loading