diff options
author | Sudheer Shanka <sudheersai@google.com> | 2019-01-28 20:33:35 -0800 |
---|---|---|
committer | Sudheer Shanka <sudheersai@google.com> | 2019-01-29 11:00:01 -0800 |
commit | b8a29fe1197577062843960c3fb85f6307279dca (patch) | |
tree | 6a407b612da50330cf3f78abd239684adffe1e56 /src/com/android | |
parent | 985aeeba373be100a3ca57cc6b1a9a58dca8b3d9 (diff) | |
download | android_packages_providers_DownloadProvider-b8a29fe1197577062843960c3fb85f6307279dca.tar.gz android_packages_providers_DownloadProvider-b8a29fe1197577062843960c3fb85f6307279dca.tar.bz2 android_packages_providers_DownloadProvider-b8a29fe1197577062843960c3fb85f6307279dca.zip |
Allow renaming of downloads from MediaProvider.
Test: manual
Change-Id: I4f18c33cbb7521c023fabf96e78394c34301b61b
Diffstat (limited to 'src/com/android')
-rw-r--r-- | src/com/android/providers/downloads/DownloadStorageProvider.java | 48 |
1 files changed, 42 insertions, 6 deletions
diff --git a/src/com/android/providers/downloads/DownloadStorageProvider.java b/src/com/android/providers/downloads/DownloadStorageProvider.java index cba9290e..458cbf4f 100644 --- a/src/com/android/providers/downloads/DownloadStorageProvider.java +++ b/src/com/android/providers/downloads/DownloadStorageProvider.java @@ -28,6 +28,7 @@ import android.app.DownloadManager; import android.app.DownloadManager.Query; import android.content.ContentResolver; import android.content.ContentUris; +import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.MatrixCursor; @@ -246,10 +247,14 @@ public class DownloadStorageProvider extends FileSystemProvider { } displayName = FileUtils.buildValidFatFilename(displayName); - final long id = Long.parseLong(docId); - if (!mDm.rename(getContext(), id, displayName)) { - throw new IllegalStateException( - "Failed to rename to " + displayName + " in downloadsManager"); + if (isMediaStoreDownload(docId)) { + renameMediaStoreDownload(docId, displayName); + } else { + final long id = Long.parseLong(docId); + if (!mDm.rename(getContext(), id, displayName)) { + throw new IllegalStateException( + "Failed to rename to " + displayName + " in downloadsManager"); + } } return null; } finally { @@ -795,6 +800,34 @@ public class DownloadStorageProvider extends FileSystemProvider { return Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); } + private void renameMediaStoreDownload(String docId, String displayName) { + final File before = getFileForMediaStoreDownload(docId); + final File after = new File(before.getParentFile(), displayName); + + if (after.exists()) { + throw new IllegalStateException("Already exists " + after); + } + if (!before.renameTo(after)) { + throw new IllegalStateException("Failed to rename from " + before + " to " + after); + } + + final long token = Binder.clearCallingIdentity(); + try { + final Uri mediaStoreUri = getMediaStoreUri(docId); + final ContentValues values = new ContentValues(); + values.put(MediaStore.Downloads.DATA, after.getAbsolutePath()); + values.put(MediaStore.Downloads.DISPLAY_NAME, displayName); + final int count = getContext().getContentResolver().update(mediaStoreUri, values, + null, null); + if (count != 1) { + throw new IllegalStateException("Failed to update " + mediaStoreUri + + ", values=" + values); + } + } finally { + Binder.restoreCallingIdentity(token); + } + } + private File getFileForMediaStoreDownload(String docId) { final long token = Binder.clearCallingIdentity(); try { @@ -862,8 +895,11 @@ public class DownloadStorageProvider extends FileSystemProvider { mediaCursor.getColumnIndex(MediaStore.Downloads.DATE_MODIFIED)) * 1000; final boolean isPending = mediaCursor.getInt( mediaCursor.getColumnIndex(MediaStore.Downloads.IS_PENDING)) == 1; - // TODO: Support renaming of downlaods from MediaStore? - final int extraFlags = isPending ? Document.FLAG_PARTIAL : 0; + + int extraFlags = isPending ? Document.FLAG_PARTIAL : 0; + if (!Document.MIME_TYPE_DIR.equals(mimeType)) { + extraFlags |= Document.FLAG_SUPPORTS_RENAME; + } includeDownload(result, docId, displayName, description, size, mimeType, lastModifiedMs, extraFlags, isPending); |