summaryrefslogtreecommitdiffstats
path: root/src/com/android/providers/downloads/DownloadReceiver.java
diff options
context:
space:
mode:
authorSudheer Shanka <sudheersai@google.com>2019-05-08 18:56:22 -0700
committerSudheer Shanka <sudheersai@google.com>2019-05-09 02:27:39 -0700
commit8d7668ae0d7f382700a1090d4079576e3a782ba7 (patch)
tree45dfd6f9e1cc86b5f0a3c2a2be5a525e45b5de63 /src/com/android/providers/downloads/DownloadReceiver.java
parentfd26f316f00d889c7b4b4ab077b0f00a1e1f29a7 (diff)
downloadandroid_packages_providers_DownloadProvider-8d7668ae0d7f382700a1090d4079576e3a782ba7.tar.gz
android_packages_providers_DownloadProvider-8d7668ae0d7f382700a1090d4079576e3a782ba7.tar.bz2
android_packages_providers_DownloadProvider-8d7668ae0d7f382700a1090d4079576e3a782ba7.zip
Update behavior of setDestinationInExternalPublicDir().
Allow apps to use DownloadManager for downloading files into known public dirs other than "Download" but don't include them as part of Downloads collection. Bug: 132136431 Test: manual Test: atest DownloadProviderTests Test: atest cts/tests/app/src/android/app/cts/DownloadManagerTest.java Test: atest cts/tests/app/DownloadManagerLegacyTest/src/android/app/cts/DownloadManagerLegacyTest.java Test: atest cts/tests/app/DownloadManagerApi28Test/src/android/app/cts/DownloadManagerApi28Test.java Change-Id: I62d4f810c71c9231e2b6d8e276a0a1e326382e14
Diffstat (limited to 'src/com/android/providers/downloads/DownloadReceiver.java')
-rw-r--r--src/com/android/providers/downloads/DownloadReceiver.java45
1 files changed, 24 insertions, 21 deletions
diff --git a/src/com/android/providers/downloads/DownloadReceiver.java b/src/com/android/providers/downloads/DownloadReceiver.java
index 6a0707bb..f0b9de71 100644
--- a/src/com/android/providers/downloads/DownloadReceiver.java
+++ b/src/com/android/providers/downloads/DownloadReceiver.java
@@ -18,6 +18,8 @@ package com.android.providers.downloads;
import static android.app.DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED;
import static android.app.DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_ONLY_COMPLETION;
+import static android.provider.Downloads.Impl.COLUMN_DESTINATION;
+import static android.provider.Downloads.Impl._DATA;
import static com.android.providers.downloads.Constants.TAG;
import static com.android.providers.downloads.Helpers.getAsyncHandler;
@@ -43,6 +45,8 @@ import android.util.Log;
import android.util.Slog;
import android.widget.Toast;
+import java.util.ArrayList;
+import java.util.Arrays;
import java.util.regex.Pattern;
/**
@@ -144,28 +148,27 @@ public class DownloadReceiver extends BroadcastReceiver {
final ContentResolver resolver = context.getContentResolver();
final int uid = intent.getIntExtra(Intent.EXTRA_UID, -1);
- // First, disown any downloads that live in shared storage
- final ContentValues values = new ContentValues();
- values.putNull(Constants.UID);
-
- final StringBuilder queryString = new StringBuilder(Constants.UID + "=" + uid);
- queryString.append(" AND ").append(Downloads.Impl.COLUMN_DESTINATION + " IN ("
- + Downloads.Impl.DESTINATION_EXTERNAL + ","
- + Downloads.Impl.DESTINATION_FILE_URI + ","
- + Downloads.Impl.DESTINATION_NON_DOWNLOADMANAGER_DOWNLOAD + ")");
- queryString.append(" AND ").append(Downloads.Impl._DATA
- + " REGEXP '" + MediaStore.Downloads.PATTERN_DOWNLOADS_FILE.pattern() + "'");
-
- final int disowned = resolver.update(Downloads.Impl.ALL_DOWNLOADS_CONTENT_URI, values,
- queryString.toString(), null);
-
- // Finally, delete any remaining downloads owned by UID
- final int deleted = resolver.delete(Downloads.Impl.ALL_DOWNLOADS_CONTENT_URI,
- Constants.UID + "=" + uid, null);
+ final ArrayList<Long> idsToDelete = new ArrayList<>();
+ final ArrayList<Long> idsToOrphan = new ArrayList<>();
+ try (Cursor cursor = resolver.query(Downloads.Impl.ALL_DOWNLOADS_CONTENT_URI,
+ new String[] { Downloads.Impl._ID, Constants.UID, COLUMN_DESTINATION, _DATA },
+ Constants.UID + "=" + uid, null, null)) {
+ Helpers.handleRemovedUidEntries(context, cursor, idsToDelete, idsToOrphan, null);
+ }
- if ((disowned + deleted) > 0) {
- Slog.d(TAG, "Disowned " + disowned + " and deleted " + deleted
- + " downloads owned by UID " + uid);
+ if (idsToOrphan.size() > 0) {
+ Log.i(Constants.TAG, "Orphaning downloads with ids "
+ + Arrays.toString(idsToOrphan.toArray()) + " as owner package is removed");
+ final ContentValues values = new ContentValues();
+ values.putNull(Constants.UID);
+ resolver.update(Downloads.Impl.ALL_DOWNLOADS_CONTENT_URI, values,
+ Helpers.buildQueryWithIds(idsToOrphan), null);
+ }
+ if (idsToDelete.size() > 0) {
+ Log.i(Constants.TAG, "Deleting downloads with ids "
+ + Arrays.toString(idsToDelete.toArray()) + " as owner package is removed");
+ resolver.delete(Downloads.Impl.ALL_DOWNLOADS_CONTENT_URI,
+ Helpers.buildQueryWithIds(idsToDelete), null);
}
}