diff options
author | Jeff Sharkey <jsharkey@android.com> | 2016-10-14 15:31:37 -0600 |
---|---|---|
committer | Jeff Sharkey <jsharkey@android.com> | 2016-10-14 15:31:39 -0600 |
commit | 16ee9158a395f3f67be12062d7f870f76e2677a5 (patch) | |
tree | af7c86c7cb5d3a4da4e5a4d6d5e9c2dde9de9a2f /src/com/android/providers/downloads | |
parent | f170ae213f471bd16f423535c8373791f570c3d8 (diff) | |
download | android_packages_providers_DownloadProvider-16ee9158a395f3f67be12062d7f870f76e2677a5.tar.gz android_packages_providers_DownloadProvider-16ee9158a395f3f67be12062d7f870f76e2677a5.tar.bz2 android_packages_providers_DownloadProvider-16ee9158a395f3f67be12062d7f870f76e2677a5.zip |
Only send DOWNLOAD_COMPLETE broadcast once.
Apps might end up confused if we tell them a download was completed
multiple times, so only send the broadcast exactly once when we
transition it into a "completed" state, either during an update() or
a delete() operation.
Test: verified single broadcast with test app
Bug: 31619480
Change-Id: I0b9139ea0e37f6d212b84314048692cd0c4f9cdf
Diffstat (limited to 'src/com/android/providers/downloads')
-rw-r--r-- | src/com/android/providers/downloads/DownloadProvider.java | 35 | ||||
-rw-r--r-- | src/com/android/providers/downloads/DownloadThread.java | 5 |
2 files changed, 25 insertions, 15 deletions
diff --git a/src/com/android/providers/downloads/DownloadProvider.java b/src/com/android/providers/downloads/DownloadProvider.java index 387c200d..edb804ea 100644 --- a/src/com/android/providers/downloads/DownloadProvider.java +++ b/src/com/android/providers/downloads/DownloadProvider.java @@ -1079,10 +1079,14 @@ public final class DownloadProvider extends ContentProvider { Helpers.validateSelection(where, sAppReadableColumnsSet); - SQLiteDatabase db = mOpenHelper.getWritableDatabase(); + final Context context = getContext(); + final ContentResolver resolver = context.getContentResolver(); + + final SQLiteDatabase db = mOpenHelper.getWritableDatabase(); int count; boolean updateSchedule = false; + boolean isCompleting = false; ContentValues filteredValues; if (Binder.getCallingPid() != Process.myPid()) { @@ -1123,6 +1127,7 @@ public final class DownloadProvider extends ContentProvider { if (isRestart || isUserBypassingSizeLimit) { updateSchedule = true; } + isCompleting = status != null && Downloads.Impl.isStatusCompleted(status); } int match = sURIMatcher.match(uri); @@ -1139,14 +1144,20 @@ public final class DownloadProvider extends ContentProvider { final SqlSelection selection = getWhereClause(uri, where, whereArgs, match); count = db.update(DB_TABLE, filteredValues, selection.getSelection(), selection.getParameters()); - if (updateSchedule) { + if (updateSchedule || isCompleting) { final long token = Binder.clearCallingIdentity(); - try { - try (Cursor cursor = db.query(DB_TABLE, new String[] { _ID }, - selection.getSelection(), selection.getParameters(), - null, null, null)) { - while (cursor.moveToNext()) { - Helpers.scheduleJob(getContext(), cursor.getInt(0)); + try (Cursor cursor = db.query(DB_TABLE, null, selection.getSelection(), + selection.getParameters(), null, null, null)) { + final DownloadInfo.Reader reader = new DownloadInfo.Reader(resolver, + cursor); + final DownloadInfo info = new DownloadInfo(context); + while (cursor.moveToNext()) { + reader.updateFromDatabase(info); + if (updateSchedule) { + Helpers.scheduleJob(context, info); + } + if (isCompleting) { + info.sendIntentIfRequested(); } } } finally { @@ -1259,8 +1270,12 @@ public final class DownloadProvider extends ContentProvider { } } - // Tell requester that download is finished - info.sendIntentIfRequested(); + // If the download wasn't completed yet, we're + // effectively completing it now, and we need to send + // any requested broadcasts + if (!Downloads.Impl.isStatusCompleted(info.mStatus)) { + info.sendIntentIfRequested(); + } } } diff --git a/src/com/android/providers/downloads/DownloadThread.java b/src/com/android/providers/downloads/DownloadThread.java index 5b5d9664..e101c74d 100644 --- a/src/com/android/providers/downloads/DownloadThread.java +++ b/src/com/android/providers/downloads/DownloadThread.java @@ -382,11 +382,6 @@ public class DownloadThread extends Thread { } if (Downloads.Impl.isStatusCompleted(mInfoDelta.mStatus)) { - // If download was canceled, we already sent requested intent when - // deleted in the provider - if (mInfoDelta.mStatus != STATUS_CANCELED) { - mInfo.sendIntentIfRequested(); - } if (mInfo.shouldScanFile(mInfoDelta.mStatus)) { DownloadScanner.requestScanBlocking(mContext, mInfo.mId, mInfoDelta.mFileName, mInfoDelta.mMimeType); |