Loading api/current.txt +1 −0 Original line number Original line Diff line number Diff line Loading @@ -26016,6 +26016,7 @@ package android.provider { field public static final int FLAG_DIR_SUPPORTS_CREATE = 8; // 0x8 field public static final int FLAG_DIR_SUPPORTS_CREATE = 8; // 0x8 field public static final int FLAG_SUPPORTS_COPY = 128; // 0x80 field public static final int FLAG_SUPPORTS_COPY = 128; // 0x80 field public static final int FLAG_SUPPORTS_DELETE = 4; // 0x4 field public static final int FLAG_SUPPORTS_DELETE = 4; // 0x4 field public static final int FLAG_SUPPORTS_MOVE = 256; // 0x100 field public static final int FLAG_SUPPORTS_RENAME = 64; // 0x40 field public static final int FLAG_SUPPORTS_RENAME = 64; // 0x40 field public static final int FLAG_SUPPORTS_THUMBNAIL = 1; // 0x1 field public static final int FLAG_SUPPORTS_THUMBNAIL = 1; // 0x1 field public static final int FLAG_SUPPORTS_WRITE = 2; // 0x2 field public static final int FLAG_SUPPORTS_WRITE = 2; // 0x2 api/system-current.txt +1 −0 Original line number Original line Diff line number Diff line Loading @@ -27990,6 +27990,7 @@ package android.provider { field public static final int FLAG_DIR_SUPPORTS_CREATE = 8; // 0x8 field public static final int FLAG_DIR_SUPPORTS_CREATE = 8; // 0x8 field public static final int FLAG_SUPPORTS_COPY = 128; // 0x80 field public static final int FLAG_SUPPORTS_COPY = 128; // 0x80 field public static final int FLAG_SUPPORTS_DELETE = 4; // 0x4 field public static final int FLAG_SUPPORTS_DELETE = 4; // 0x4 field public static final int FLAG_SUPPORTS_MOVE = 256; // 0x100 field public static final int FLAG_SUPPORTS_RENAME = 64; // 0x40 field public static final int FLAG_SUPPORTS_RENAME = 64; // 0x40 field public static final int FLAG_SUPPORTS_THUMBNAIL = 1; // 0x1 field public static final int FLAG_SUPPORTS_THUMBNAIL = 1; // 0x1 field public static final int FLAG_SUPPORTS_WRITE = 2; // 0x2 field public static final int FLAG_SUPPORTS_WRITE = 2; // 0x2 core/java/android/provider/DocumentsContract.java +48 −3 Original line number Original line Diff line number Diff line Loading @@ -324,12 +324,21 @@ public final class DocumentsContract { * within the same document provider. * within the same document provider. * * * @see #COLUMN_FLAGS * @see #COLUMN_FLAGS * @see DocumentsContract#copyDocument(ContentProviderClient, Uri, * @see DocumentsContract#copyDocument(ContentProviderClient, Uri, Uri) * String) * @see DocumentsProvider#copyDocument(String, String) * @see DocumentsProvider#copyDocument(String, String, String) */ */ public static final int FLAG_SUPPORTS_COPY = 1 << 7; public static final int FLAG_SUPPORTS_COPY = 1 << 7; /** * Flag indicating that a document can be moved to another location * within the same document provider. * * @see #COLUMN_FLAGS * @see DocumentsContract#moveDocument(ContentProviderClient, Uri, Uri) * @see DocumentsProvider#moveDocument(String, String) */ public static final int FLAG_SUPPORTS_MOVE = 1 << 8; /** /** * Flag indicating that document titles should be hidden when viewing * Flag indicating that document titles should be hidden when viewing * this directory in a larger format grid. For example, a directory * this directory in a larger format grid. For example, a directory Loading Loading @@ -553,6 +562,8 @@ public final class DocumentsContract { public static final String METHOD_DELETE_DOCUMENT = "android:deleteDocument"; public static final String METHOD_DELETE_DOCUMENT = "android:deleteDocument"; /** {@hide} */ /** {@hide} */ public static final String METHOD_COPY_DOCUMENT = "android:copyDocument"; public static final String METHOD_COPY_DOCUMENT = "android:copyDocument"; /** {@hide} */ public static final String METHOD_MOVE_DOCUMENT = "android:moveDocument"; /** {@hide} */ /** {@hide} */ public static final String EXTRA_URI = "uri"; public static final String EXTRA_URI = "uri"; Loading Loading @@ -1065,6 +1076,40 @@ public final class DocumentsContract { return out.getParcelable(DocumentsContract.EXTRA_URI); return out.getParcelable(DocumentsContract.EXTRA_URI); } } /** * Moves the given document under a new parent. * * @param sourceDocumentUri document with {@link Document#FLAG_SUPPORTS_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) { final ContentProviderClient client = resolver.acquireUnstableContentProviderClient( sourceDocumentUri.getAuthority()); try { return moveDocument(client, sourceDocumentUri, targetParentDocumentUri); } catch (Exception e) { Log.w(TAG, "Failed to move document", e); return null; } finally { ContentProviderClient.releaseQuietly(client); } } /** {@hide} */ public static Uri moveDocument(ContentProviderClient client, Uri sourceDocumentUri, Uri targetParentDocumentUri) throws RemoteException { final Bundle in = new Bundle(); in.putParcelable(DocumentsContract.EXTRA_URI, sourceDocumentUri); in.putParcelable(DocumentsContract.EXTRA_TARGET_URI, targetParentDocumentUri); final Bundle out = client.call(METHOD_MOVE_DOCUMENT, null, in); return out.getParcelable(DocumentsContract.EXTRA_URI); } /** /** * Open the given image for thumbnail purposes, using any embedded EXIF * Open the given image for thumbnail purposes, using any embedded EXIF * thumbnail if available, and providing orientation hints from the parent * thumbnail if available, and providing orientation hints from the parent Loading core/java/android/provider/DocumentsProvider.java +45 −0 Original line number Original line Diff line number Diff line Loading @@ -20,6 +20,7 @@ import static android.provider.DocumentsContract.METHOD_CREATE_DOCUMENT; import static android.provider.DocumentsContract.METHOD_DELETE_DOCUMENT; import static android.provider.DocumentsContract.METHOD_DELETE_DOCUMENT; import static android.provider.DocumentsContract.METHOD_RENAME_DOCUMENT; import static android.provider.DocumentsContract.METHOD_RENAME_DOCUMENT; import static android.provider.DocumentsContract.METHOD_COPY_DOCUMENT; import static android.provider.DocumentsContract.METHOD_COPY_DOCUMENT; import static android.provider.DocumentsContract.METHOD_MOVE_DOCUMENT; import static android.provider.DocumentsContract.buildDocumentUri; import static android.provider.DocumentsContract.buildDocumentUri; import static android.provider.DocumentsContract.buildDocumentUriMaybeUsingTree; import static android.provider.DocumentsContract.buildDocumentUriMaybeUsingTree; import static android.provider.DocumentsContract.buildTreeDocumentUri; import static android.provider.DocumentsContract.buildTreeDocumentUri; Loading Loading @@ -277,6 +278,24 @@ public abstract class DocumentsProvider extends ContentProvider { throw new UnsupportedOperationException("Copy not supported"); throw new UnsupportedOperationException("Copy not supported"); } } /** * Move the requested document or a document tree. * <p> * Moves a document including all child documents to another location within * the same document provider. Upon completion returns the document id of * the copied document at the target destination. {@code null} must never * be returned. * * @param sourceDocumentId 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) throws FileNotFoundException { throw new UnsupportedOperationException("Move not supported"); } /** /** * Return all roots currently provided. To display to users, you must define * Return all roots currently provided. To display to users, you must define * at least one root. You should avoid making network requests to keep this * at least one root. You should avoid making network requests to keep this Loading Loading @@ -725,6 +744,32 @@ public abstract class DocumentsProvider extends ContentProvider { out.putParcelable(DocumentsContract.EXTRA_URI, newDocumentUri); out.putParcelable(DocumentsContract.EXTRA_URI, newDocumentUri); } } } else if (METHOD_MOVE_DOCUMENT.equals(method)) { final Uri targetUri = extras.getParcelable(DocumentsContract.EXTRA_TARGET_URI); final String targetId = DocumentsContract.getDocumentId(targetUri); enforceReadPermissionInner(documentUri, null); enforceWritePermissionInner(targetUri, null); final String displayName = extras.getString(Document.COLUMN_DISPLAY_NAME); final String newDocumentId = moveDocument(documentId, targetId); if (newDocumentId != null) { final Uri newDocumentUri = buildDocumentUriMaybeUsingTree(documentUri, newDocumentId); if (!isTreeUri(newDocumentUri)) { final int modeFlags = getCallingOrSelfUriPermissionModeFlags(context, documentUri); context.grantUriPermission(getCallingPackage(), newDocumentUri, modeFlags); } out.putParcelable(DocumentsContract.EXTRA_URI, newDocumentUri); } // Original document no longer exists, clean up any grants revokeDocumentPermission(documentId); } else { } else { throw new UnsupportedOperationException("Method not supported " + method); throw new UnsupportedOperationException("Method not supported " + method); } } Loading Loading
api/current.txt +1 −0 Original line number Original line Diff line number Diff line Loading @@ -26016,6 +26016,7 @@ package android.provider { field public static final int FLAG_DIR_SUPPORTS_CREATE = 8; // 0x8 field public static final int FLAG_DIR_SUPPORTS_CREATE = 8; // 0x8 field public static final int FLAG_SUPPORTS_COPY = 128; // 0x80 field public static final int FLAG_SUPPORTS_COPY = 128; // 0x80 field public static final int FLAG_SUPPORTS_DELETE = 4; // 0x4 field public static final int FLAG_SUPPORTS_DELETE = 4; // 0x4 field public static final int FLAG_SUPPORTS_MOVE = 256; // 0x100 field public static final int FLAG_SUPPORTS_RENAME = 64; // 0x40 field public static final int FLAG_SUPPORTS_RENAME = 64; // 0x40 field public static final int FLAG_SUPPORTS_THUMBNAIL = 1; // 0x1 field public static final int FLAG_SUPPORTS_THUMBNAIL = 1; // 0x1 field public static final int FLAG_SUPPORTS_WRITE = 2; // 0x2 field public static final int FLAG_SUPPORTS_WRITE = 2; // 0x2
api/system-current.txt +1 −0 Original line number Original line Diff line number Diff line Loading @@ -27990,6 +27990,7 @@ package android.provider { field public static final int FLAG_DIR_SUPPORTS_CREATE = 8; // 0x8 field public static final int FLAG_DIR_SUPPORTS_CREATE = 8; // 0x8 field public static final int FLAG_SUPPORTS_COPY = 128; // 0x80 field public static final int FLAG_SUPPORTS_COPY = 128; // 0x80 field public static final int FLAG_SUPPORTS_DELETE = 4; // 0x4 field public static final int FLAG_SUPPORTS_DELETE = 4; // 0x4 field public static final int FLAG_SUPPORTS_MOVE = 256; // 0x100 field public static final int FLAG_SUPPORTS_RENAME = 64; // 0x40 field public static final int FLAG_SUPPORTS_RENAME = 64; // 0x40 field public static final int FLAG_SUPPORTS_THUMBNAIL = 1; // 0x1 field public static final int FLAG_SUPPORTS_THUMBNAIL = 1; // 0x1 field public static final int FLAG_SUPPORTS_WRITE = 2; // 0x2 field public static final int FLAG_SUPPORTS_WRITE = 2; // 0x2
core/java/android/provider/DocumentsContract.java +48 −3 Original line number Original line Diff line number Diff line Loading @@ -324,12 +324,21 @@ public final class DocumentsContract { * within the same document provider. * within the same document provider. * * * @see #COLUMN_FLAGS * @see #COLUMN_FLAGS * @see DocumentsContract#copyDocument(ContentProviderClient, Uri, * @see DocumentsContract#copyDocument(ContentProviderClient, Uri, Uri) * String) * @see DocumentsProvider#copyDocument(String, String) * @see DocumentsProvider#copyDocument(String, String, String) */ */ public static final int FLAG_SUPPORTS_COPY = 1 << 7; public static final int FLAG_SUPPORTS_COPY = 1 << 7; /** * Flag indicating that a document can be moved to another location * within the same document provider. * * @see #COLUMN_FLAGS * @see DocumentsContract#moveDocument(ContentProviderClient, Uri, Uri) * @see DocumentsProvider#moveDocument(String, String) */ public static final int FLAG_SUPPORTS_MOVE = 1 << 8; /** /** * Flag indicating that document titles should be hidden when viewing * Flag indicating that document titles should be hidden when viewing * this directory in a larger format grid. For example, a directory * this directory in a larger format grid. For example, a directory Loading Loading @@ -553,6 +562,8 @@ public final class DocumentsContract { public static final String METHOD_DELETE_DOCUMENT = "android:deleteDocument"; public static final String METHOD_DELETE_DOCUMENT = "android:deleteDocument"; /** {@hide} */ /** {@hide} */ public static final String METHOD_COPY_DOCUMENT = "android:copyDocument"; public static final String METHOD_COPY_DOCUMENT = "android:copyDocument"; /** {@hide} */ public static final String METHOD_MOVE_DOCUMENT = "android:moveDocument"; /** {@hide} */ /** {@hide} */ public static final String EXTRA_URI = "uri"; public static final String EXTRA_URI = "uri"; Loading Loading @@ -1065,6 +1076,40 @@ public final class DocumentsContract { return out.getParcelable(DocumentsContract.EXTRA_URI); return out.getParcelable(DocumentsContract.EXTRA_URI); } } /** * Moves the given document under a new parent. * * @param sourceDocumentUri document with {@link Document#FLAG_SUPPORTS_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) { final ContentProviderClient client = resolver.acquireUnstableContentProviderClient( sourceDocumentUri.getAuthority()); try { return moveDocument(client, sourceDocumentUri, targetParentDocumentUri); } catch (Exception e) { Log.w(TAG, "Failed to move document", e); return null; } finally { ContentProviderClient.releaseQuietly(client); } } /** {@hide} */ public static Uri moveDocument(ContentProviderClient client, Uri sourceDocumentUri, Uri targetParentDocumentUri) throws RemoteException { final Bundle in = new Bundle(); in.putParcelable(DocumentsContract.EXTRA_URI, sourceDocumentUri); in.putParcelable(DocumentsContract.EXTRA_TARGET_URI, targetParentDocumentUri); final Bundle out = client.call(METHOD_MOVE_DOCUMENT, null, in); return out.getParcelable(DocumentsContract.EXTRA_URI); } /** /** * Open the given image for thumbnail purposes, using any embedded EXIF * Open the given image for thumbnail purposes, using any embedded EXIF * thumbnail if available, and providing orientation hints from the parent * thumbnail if available, and providing orientation hints from the parent Loading
core/java/android/provider/DocumentsProvider.java +45 −0 Original line number Original line Diff line number Diff line Loading @@ -20,6 +20,7 @@ import static android.provider.DocumentsContract.METHOD_CREATE_DOCUMENT; import static android.provider.DocumentsContract.METHOD_DELETE_DOCUMENT; import static android.provider.DocumentsContract.METHOD_DELETE_DOCUMENT; import static android.provider.DocumentsContract.METHOD_RENAME_DOCUMENT; import static android.provider.DocumentsContract.METHOD_RENAME_DOCUMENT; import static android.provider.DocumentsContract.METHOD_COPY_DOCUMENT; import static android.provider.DocumentsContract.METHOD_COPY_DOCUMENT; import static android.provider.DocumentsContract.METHOD_MOVE_DOCUMENT; import static android.provider.DocumentsContract.buildDocumentUri; import static android.provider.DocumentsContract.buildDocumentUri; import static android.provider.DocumentsContract.buildDocumentUriMaybeUsingTree; import static android.provider.DocumentsContract.buildDocumentUriMaybeUsingTree; import static android.provider.DocumentsContract.buildTreeDocumentUri; import static android.provider.DocumentsContract.buildTreeDocumentUri; Loading Loading @@ -277,6 +278,24 @@ public abstract class DocumentsProvider extends ContentProvider { throw new UnsupportedOperationException("Copy not supported"); throw new UnsupportedOperationException("Copy not supported"); } } /** * Move the requested document or a document tree. * <p> * Moves a document including all child documents to another location within * the same document provider. Upon completion returns the document id of * the copied document at the target destination. {@code null} must never * be returned. * * @param sourceDocumentId 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) throws FileNotFoundException { throw new UnsupportedOperationException("Move not supported"); } /** /** * Return all roots currently provided. To display to users, you must define * Return all roots currently provided. To display to users, you must define * at least one root. You should avoid making network requests to keep this * at least one root. You should avoid making network requests to keep this Loading Loading @@ -725,6 +744,32 @@ public abstract class DocumentsProvider extends ContentProvider { out.putParcelable(DocumentsContract.EXTRA_URI, newDocumentUri); out.putParcelable(DocumentsContract.EXTRA_URI, newDocumentUri); } } } else if (METHOD_MOVE_DOCUMENT.equals(method)) { final Uri targetUri = extras.getParcelable(DocumentsContract.EXTRA_TARGET_URI); final String targetId = DocumentsContract.getDocumentId(targetUri); enforceReadPermissionInner(documentUri, null); enforceWritePermissionInner(targetUri, null); final String displayName = extras.getString(Document.COLUMN_DISPLAY_NAME); final String newDocumentId = moveDocument(documentId, targetId); if (newDocumentId != null) { final Uri newDocumentUri = buildDocumentUriMaybeUsingTree(documentUri, newDocumentId); if (!isTreeUri(newDocumentUri)) { final int modeFlags = getCallingOrSelfUriPermissionModeFlags(context, documentUri); context.grantUriPermission(getCallingPackage(), newDocumentUri, modeFlags); } out.putParcelable(DocumentsContract.EXTRA_URI, newDocumentUri); } // Original document no longer exists, clean up any grants revokeDocumentPermission(documentId); } else { } else { throw new UnsupportedOperationException("Method not supported " + method); throw new UnsupportedOperationException("Method not supported " + method); } } Loading