summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJeff Sharkey <jsharkey@android.com>2017-09-28 14:41:38 -0600
committerJeff Sharkey <jsharkey@android.com>2017-09-28 14:41:40 -0600
commitb02470a0886c0466ec3fe201672dcfd0b3492155 (patch)
tree14c416e284bcee6cfe50e94a967156d7081e02f6 /src
parent87cd054358967b8d2670f15d2ecd1a27222f072d (diff)
downloadandroid_packages_providers_DownloadProvider-b02470a0886c0466ec3fe201672dcfd0b3492155.tar.gz
android_packages_providers_DownloadProvider-b02470a0886c0466ec3fe201672dcfd0b3492155.tar.bz2
android_packages_providers_DownloadProvider-b02470a0886c0466ec3fe201672dcfd0b3492155.zip
Prevent duplicate jobs for same download.
Before this CL, we could have started duplicate jobs for the same download ID in parallel. Now, we ignore duplicate jobs for the same download. This requires us to only reschedule a job after removing it from mActiveThreads, so slight refactoring there. Test: bit DownloadProviderTests:* Bug: 36227864 Change-Id: I3103480859c5eb9488817165187c5dae05b2d843
Diffstat (limited to 'src')
-rw-r--r--src/com/android/providers/downloads/DownloadJobService.java12
-rw-r--r--src/com/android/providers/downloads/DownloadThread.java5
2 files changed, 14 insertions, 3 deletions
diff --git a/src/com/android/providers/downloads/DownloadJobService.java b/src/com/android/providers/downloads/DownloadJobService.java
index 0ce4266a..d09738c2 100644
--- a/src/com/android/providers/downloads/DownloadJobService.java
+++ b/src/com/android/providers/downloads/DownloadJobService.java
@@ -66,6 +66,10 @@ public class DownloadJobService extends JobService {
final DownloadThread thread;
synchronized (mActiveThreads) {
+ if (mActiveThreads.indexOfKey(id) >= 0) {
+ Log.w(TAG, "Odd, already running download " + id);
+ return false;
+ }
thread = new DownloadThread(this, params, info);
mActiveThreads.put(id, thread);
}
@@ -93,14 +97,20 @@ public class DownloadJobService extends JobService {
}
public void jobFinishedInternal(JobParameters params, boolean needsReschedule) {
+ final int id = params.getJobId();
+
synchronized (mActiveThreads) {
mActiveThreads.remove(params.getJobId());
}
+ if (needsReschedule) {
+ Helpers.scheduleJob(this, DownloadInfo.queryDownloadInfo(this, id));
+ }
// Update notifications one last time while job is protecting us
mObserver.onChange(false);
- jobFinished(params, needsReschedule);
+ // We do our own rescheduling above
+ jobFinished(params, false);
}
private ContentObserver mObserver = new ContentObserver(Helpers.getAsyncHandler()) {
diff --git a/src/com/android/providers/downloads/DownloadThread.java b/src/com/android/providers/downloads/DownloadThread.java
index 9c920053..1476f4a0 100644
--- a/src/com/android/providers/downloads/DownloadThread.java
+++ b/src/com/android/providers/downloads/DownloadThread.java
@@ -384,6 +384,7 @@ public class DownloadThread extends Thread {
mNetworkPolicy.unregisterListener(mPolicyListener);
}
+ boolean needsReschedule = false;
if (Downloads.Impl.isStatusCompleted(mInfoDelta.mStatus)) {
if (mInfo.shouldScanFile(mInfoDelta.mStatus)) {
DownloadScanner.requestScanBlocking(mContext, mInfo.mId, mInfoDelta.mFileName,
@@ -392,10 +393,10 @@ public class DownloadThread extends Thread {
} else if (mInfoDelta.mStatus == STATUS_WAITING_TO_RETRY
|| mInfoDelta.mStatus == STATUS_WAITING_FOR_NETWORK
|| mInfoDelta.mStatus == STATUS_QUEUED_FOR_WIFI) {
- Helpers.scheduleJob(mContext, DownloadInfo.queryDownloadInfo(mContext, mId));
+ needsReschedule = true;
}
- mJobService.jobFinishedInternal(mParams, false);
+ mJobService.jobFinishedInternal(mParams, needsReschedule);
}
public void requestShutdown() {