diff options
author | Sudheer Shanka <sudheersai@google.com> | 2019-01-30 18:22:02 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2019-01-30 18:22:02 +0000 |
commit | cf165b88b2b96f4947fa85e76c16be491dac8e5d (patch) | |
tree | 9e6feaa61648b99d7e5b0340beebd18c95f9b33d /src/com/android | |
parent | b8a29fe1197577062843960c3fb85f6307279dca (diff) | |
parent | 5bf5cedcfbe27ae6febbc3871fdcc97494d3cfe6 (diff) | |
download | android_packages_providers_DownloadProvider-cf165b88b2b96f4947fa85e76c16be491dac8e5d.tar.gz android_packages_providers_DownloadProvider-cf165b88b2b96f4947fa85e76c16be491dac8e5d.tar.bz2 android_packages_providers_DownloadProvider-cf165b88b2b96f4947fa85e76c16be491dac8e5d.zip |
Merge "Don't ignore COLUMN_MEDIA_SCANNED values from caller."
Diffstat (limited to 'src/com/android')
4 files changed, 48 insertions, 27 deletions
diff --git a/src/com/android/providers/downloads/DownloadInfo.java b/src/com/android/providers/downloads/DownloadInfo.java index bf9b08bf..a414bd86 100644 --- a/src/com/android/providers/downloads/DownloadInfo.java +++ b/src/com/android/providers/downloads/DownloadInfo.java @@ -447,7 +447,7 @@ public class DownloadInfo { * Returns whether a file should be scanned */ public boolean shouldScanFile(int status) { - return (mMediaScanned == 0) + return (mMediaScanned == Downloads.Impl.MEDIA_NOT_SCANNED) && (mDestination == Downloads.Impl.DESTINATION_EXTERNAL || mDestination == Downloads.Impl.DESTINATION_FILE_URI || mDestination == Downloads.Impl.DESTINATION_NON_DOWNLOADMANAGER_DOWNLOAD) 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"); } diff --git a/src/com/android/providers/downloads/DownloadScanner.java b/src/com/android/providers/downloads/DownloadScanner.java index 4a5ba87e..a4ec0ba8 100644 --- a/src/com/android/providers/downloads/DownloadScanner.java +++ b/src/com/android/providers/downloads/DownloadScanner.java @@ -156,13 +156,19 @@ public class DownloadScanner implements MediaScannerConnectionClient { return; } + // File got deleted while waiting for it to be mediascanned. + if (uri == null) { + if (mLatch != null) { + mLatch.countDown(); + } + return; + } + // Update scanned column, which will kick off a database update pass, // eventually deciding if overall service is ready for teardown. final ContentValues values = new ContentValues(); values.put(Downloads.Impl.COLUMN_MEDIA_SCANNED, 1); - if (uri != null) { - values.put(Downloads.Impl.COLUMN_MEDIAPROVIDER_URI, uri.toString()); - } + values.put(Downloads.Impl.COLUMN_MEDIAPROVIDER_URI, uri.toString()); final ContentResolver resolver = mContext.getContentResolver(); final Uri downloadUri = ContentUris.withAppendedId( diff --git a/src/com/android/providers/downloads/DownloadThread.java b/src/com/android/providers/downloads/DownloadThread.java index 54cc1a5d..bc7997f6 100644 --- a/src/com/android/providers/downloads/DownloadThread.java +++ b/src/com/android/providers/downloads/DownloadThread.java @@ -388,12 +388,7 @@ public class DownloadThread extends Thread { } boolean needsReschedule = false; - if (Downloads.Impl.isStatusCompleted(mInfoDelta.mStatus)) { - if (mInfo.shouldScanFile(mInfoDelta.mStatus)) { - DownloadScanner.requestScanBlocking(mContext, mInfo.mId, mInfoDelta.mFileName, - mInfoDelta.mMimeType); - } - } else if (mInfoDelta.mStatus == STATUS_WAITING_TO_RETRY + if (mInfoDelta.mStatus == STATUS_WAITING_TO_RETRY || mInfoDelta.mStatus == STATUS_WAITING_FOR_NETWORK || mInfoDelta.mStatus == STATUS_QUEUED_FOR_WIFI) { needsReschedule = true; |