summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSudheer Shanka <sudheersai@google.com>2019-01-29 14:53:58 -0800
committerSudheer Shanka <sudheersai@google.com>2019-01-29 18:00:31 -0800
commit5bf5cedcfbe27ae6febbc3871fdcc97494d3cfe6 (patch)
tree385f5fd9f96cb9af870d1d5aa15bfa2759f72226 /src
parent985aeeba373be100a3ca57cc6b1a9a58dca8b3d9 (diff)
downloadandroid_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')
-rw-r--r--src/com/android/providers/downloads/DownloadInfo.java2
-rw-r--r--src/com/android/providers/downloads/DownloadProvider.java54
-rw-r--r--src/com/android/providers/downloads/DownloadScanner.java12
-rw-r--r--src/com/android/providers/downloads/DownloadThread.java7
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;