summaryrefslogtreecommitdiffstats
path: root/src/com/android
diff options
context:
space:
mode:
authorJeff Sharkey <jsharkey@android.com>2016-10-14 15:31:37 -0600
committerJeff Sharkey <jsharkey@android.com>2016-10-14 15:31:39 -0600
commit16ee9158a395f3f67be12062d7f870f76e2677a5 (patch)
treeaf7c86c7cb5d3a4da4e5a4d6d5e9c2dde9de9a2f /src/com/android
parentf170ae213f471bd16f423535c8373791f570c3d8 (diff)
downloadandroid_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')
-rw-r--r--src/com/android/providers/downloads/DownloadProvider.java35
-rw-r--r--src/com/android/providers/downloads/DownloadThread.java5
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);