diff options
author | Sudheer Shanka <sudheersai@google.com> | 2019-05-08 18:56:22 -0700 |
---|---|---|
committer | Sudheer Shanka <sudheersai@google.com> | 2019-05-09 02:27:39 -0700 |
commit | 8d7668ae0d7f382700a1090d4079576e3a782ba7 (patch) | |
tree | 45dfd6f9e1cc86b5f0a3c2a2be5a525e45b5de63 /src/com/android/providers/downloads/DownloadReceiver.java | |
parent | fd26f316f00d889c7b4b4ab077b0f00a1e1f29a7 (diff) | |
download | android_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.java | 45 |
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); } } |