diff options
author | Sudheer Shanka <sudheersai@google.com> | 2019-01-29 14:53:58 -0800 |
---|---|---|
committer | Sudheer Shanka <sudheersai@google.com> | 2019-01-29 18:00:31 -0800 |
commit | 5bf5cedcfbe27ae6febbc3871fdcc97494d3cfe6 (patch) | |
tree | 385f5fd9f96cb9af870d1d5aa15bfa2759f72226 /src/com/android/providers/downloads/DownloadProvider.java | |
parent | 985aeeba373be100a3ca57cc6b1a9a58dca8b3d9 (diff) | |
download | android_packages_providers_DownloadProvider-5bf5cedcfbe27ae6febbc3871fdcc97494d3cfe6.tar.gz android_packages_providers_DownloadProvider-5bf5cedcfbe27ae6febbc3871fdcc97494d3cfe6.tar.bz2 android_packages_providers_DownloadProvider-5bf5cedcfbe27ae6febbc3871fdcc97494d3cfe6.zip |
Don't ignore COLUMN_MEDIA_SCANNED values from caller.
Right now, DownloadProvider only uses the COLUMN_MEDIA_SCANNED
value if it is coming from addCompletedDownload and for the rest
of the requests, it ignores the incoming COLUMN_MEDIA_SCANNED value
and always invokes mediascanner. This is not what the documentation
says. For e.g., if the caller uses DownloadManager.setDestinationUri()
API, then unless otherwise specified, the download doesn't need to be
mediascanned.
Also, since we are inserting user visible downloads to MediaProvider,
use that info to populate the COLUMN_MEDIAPROVIDER_URI column as well
and update DownloadProvider to not invoke MediaScanner.
Bug: 123440050
Test: atest DownloadProviderTests
Test: atest cts/tests/app/src/android/app/cts/DownloadManagerTest.java
Test: atest cts/tests/tests/provider/src/android/provider/cts/MediaStore*
Change-Id: Ia667319a811d502d42a0602581bdc34ed46d88f7
Diffstat (limited to 'src/com/android/providers/downloads/DownloadProvider.java')
-rw-r--r-- | src/com/android/providers/downloads/DownloadProvider.java | 54 |
1 files changed, 37 insertions, 17 deletions
diff --git a/src/com/android/providers/downloads/DownloadProvider.java b/src/com/android/providers/downloads/DownloadProvider.java index 55fa2a31..b4a28182 100644 --- a/src/com/android/providers/downloads/DownloadProvider.java +++ b/src/com/android/providers/downloads/DownloadProvider.java @@ -21,8 +21,12 @@ import static android.os.Binder.getCallingUid; import static android.provider.BaseColumns._ID; import static android.provider.Downloads.Impl.COLUMN_DESTINATION; import static android.provider.Downloads.Impl.COLUMN_IS_VISIBLE_IN_DOWNLOADS_UI; +import static android.provider.Downloads.Impl.COLUMN_MEDIA_SCANNED; import static android.provider.Downloads.Impl.COLUMN_OTHER_UID; import static android.provider.Downloads.Impl.DESTINATION_NON_DOWNLOADMANAGER_DOWNLOAD; +import static android.provider.Downloads.Impl.MEDIA_NOT_SCANNABLE; +import static android.provider.Downloads.Impl.MEDIA_NOT_SCANNED; +import static android.provider.Downloads.Impl.MEDIA_SCANNED; import static android.provider.Downloads.Impl.PERMISSION_ACCESS_ALL; import android.annotation.NonNull; @@ -671,7 +675,6 @@ public final class DownloadProvider extends ContentProvider { filteredValues.put(Downloads.Impl.COLUMN_TOTAL_BYTES, values.getAsLong(Downloads.Impl.COLUMN_TOTAL_BYTES)); filteredValues.put(Downloads.Impl.COLUMN_CURRENT_BYTES, 0); - copyInteger(Downloads.Impl.COLUMN_MEDIA_SCANNED, values, filteredValues); copyString(Downloads.Impl._DATA, values, filteredValues); copyBoolean(Downloads.Impl.COLUMN_ALLOW_WRITE, values, filteredValues); } else { @@ -738,32 +741,41 @@ public final class DownloadProvider extends ContentProvider { copyInteger(Downloads.Impl.COLUMN_FLAGS, values, filteredValues); } - if (Constants.LOGVV) { - Log.v(Constants.TAG, "initiating download with UID " - + filteredValues.getAsInteger(Constants.UID)); - if (filteredValues.containsKey(Downloads.Impl.COLUMN_OTHER_UID)) { - Log.v(Constants.TAG, "other UID " + - filteredValues.getAsInteger(Downloads.Impl.COLUMN_OTHER_UID)); - } - } + final Integer mediaScanned = values.getAsInteger(Downloads.Impl.COLUMN_MEDIA_SCANNED); + filteredValues.put(COLUMN_MEDIA_SCANNED, + mediaScanned == null ? MEDIA_NOT_SCANNED : mediaScanned); - if (values.getAsInteger(COLUMN_DESTINATION) == DESTINATION_NON_DOWNLOADMANAGER_DOWNLOAD - && values.getAsBoolean(COLUMN_IS_VISIBLE_IN_DOWNLOADS_UI)) { + final boolean shouldBeVisibleToUser + = filteredValues.getAsBoolean(COLUMN_IS_VISIBLE_IN_DOWNLOADS_UI) + || filteredValues.getAsInteger(COLUMN_MEDIA_SCANNED) == MEDIA_NOT_SCANNED; + if (shouldBeVisibleToUser && filteredValues.getAsInteger(COLUMN_DESTINATION) + == DESTINATION_NON_DOWNLOADMANAGER_DOWNLOAD) { final CallingIdentity token = clearCallingIdentity(); try (ContentProviderClient client = getContext().getContentResolver() .acquireContentProviderClient(MediaStore.AUTHORITY)) { final Uri mediaStoreUri = updateMediaProvider(client, null, convertToMediaProviderValues(filteredValues)); if (mediaStoreUri != null) { - filteredValues.put(Downloads.Impl.COLUMN_MEDIAPROVIDER_URI, - mediaStoreUri.toString()); filteredValues.put(Downloads.Impl.COLUMN_MEDIASTORE_URI, mediaStoreUri.toString()); + filteredValues.put(Downloads.Impl.COLUMN_MEDIAPROVIDER_URI, + mediaStoreUri.toString()); + filteredValues.put(COLUMN_MEDIA_SCANNED, MEDIA_SCANNED); } } finally { restoreCallingIdentity(token); } } + + if (Constants.LOGVV) { + Log.v(Constants.TAG, "initiating download with UID " + + filteredValues.getAsInteger(Constants.UID)); + if (filteredValues.containsKey(Downloads.Impl.COLUMN_OTHER_UID)) { + Log.v(Constants.TAG, "other UID " + + filteredValues.getAsInteger(Downloads.Impl.COLUMN_OTHER_UID)); + } + } + long rowID = db.insert(DB_TABLE, null, filteredValues); if (rowID == -1) { Log.d(Constants.TAG, "couldn't insert into downloads database"); @@ -864,7 +876,7 @@ public final class DownloadProvider extends ContentProvider { mediaValues.put(MediaStore.Downloads.MIME_TYPE, info.mMimeType); mediaValues.put(MediaStore.Downloads.IS_PENDING, Downloads.Impl.isStatusSuccess(info.mStatus) ? 0 : 1); - mediaValues.put(Files.FileColumns.IS_DOWNLOAD, info.mIsVisibleInDownloadsUi ? 1 : 0); + mediaValues.put(Files.FileColumns.IS_DOWNLOAD, 1); return mediaValues; } @@ -1473,6 +1485,8 @@ public final class DownloadProvider extends ContentProvider { final ContentValues updateValues = new ContentValues(); while (cursor.moveToNext()) { reader.updateFromDatabase(info); + final boolean visibleToUser = info.mIsVisibleInDownloadsUi + || (info.mMediaScanned != MEDIA_NOT_SCANNABLE); if (info.mFileName == null) { if (info.mMediaStoreUri != null) { client.delete(Uri.parse(info.mMediaStoreUri), null, null); @@ -1481,10 +1495,11 @@ public final class DownloadProvider extends ContentProvider { qb.update(db, updateValues, Downloads.Impl._ID + "=?", new String[] { Long.toString(info.mId) }); } - } else if (info.mDestination == Downloads.Impl.DESTINATION_EXTERNAL + } else if ((info.mDestination == Downloads.Impl.DESTINATION_EXTERNAL || info.mDestination == Downloads.Impl.DESTINATION_FILE_URI || info.mDestination == Downloads.Impl - .DESTINATION_NON_DOWNLOADMANAGER_DOWNLOAD) { + .DESTINATION_NON_DOWNLOADMANAGER_DOWNLOAD) + && visibleToUser) { final Uri mediaStoreUri = updateMediaProvider(client, info.mMediaStoreUri, convertToMediaProviderValues(info)); if (!TextUtils.equals(info.mMediaStoreUri, @@ -1492,9 +1507,14 @@ public final class DownloadProvider extends ContentProvider { updateValues.clear(); if (mediaStoreUri == null) { updateValues.putNull(Downloads.Impl.COLUMN_MEDIASTORE_URI); + updateValues.putNull(Downloads.Impl.COLUMN_MEDIAPROVIDER_URI); + updateValues.put(COLUMN_MEDIA_SCANNED, MEDIA_NOT_SCANNED); } else { updateValues.put(Downloads.Impl.COLUMN_MEDIASTORE_URI, mediaStoreUri.toString()); + updateValues.put(Downloads.Impl.COLUMN_MEDIAPROVIDER_URI, + mediaStoreUri.toString()); + updateValues.put(COLUMN_MEDIA_SCANNED, MEDIA_SCANNED); } qb.update(db, updateValues, Downloads.Impl._ID + "=?", new String[] { Long.toString(info.mId) }); @@ -1738,7 +1758,7 @@ public final class DownloadProvider extends ContentProvider { destination == Downloads.Impl.DESTINATION_EXTERNAL || destination == Downloads.Impl.DESTINATION_FILE_URI || destination == Downloads.Impl.DESTINATION_NON_DOWNLOADMANAGER_DOWNLOAD) - && mediaScanned != 2; + && mediaScanned != Downloads.Impl.MEDIA_NOT_SCANNABLE; } else { throw new FileNotFoundException("Failed moveToFirst"); } |