Merge "Fix an infinitely retrying download problem" into jb-ub-mail-ur10

This commit is contained in:
Martin Hibdon 2013-11-12 19:28:59 +00:00 committed by Android (Google) Code Review
commit ad0e42887f

View File

@ -196,9 +196,25 @@ public class AttachmentDownloadService extends Service implements Runnable {
accountId = messageId = -1; accountId = messageId = -1;
} }
priority = getPriority(attachment); priority = getPriority(attachment);
time = System.currentTimeMillis(); time = SystemClock.elapsedRealtime();
} }
private DownloadRequest(DownloadRequest orig, long newTime) {
priority = orig.priority;
attachmentId = orig.attachmentId;
messageId = orig.messageId;
accountId = orig.accountId;
time = newTime;
inProgress = orig.inProgress;
lastStatusCode = orig.lastStatusCode;
lastProgress = orig.lastProgress;
lastCallbackTime = orig.lastCallbackTime;
startTime = orig.startTime;
retryCount = orig.retryCount;
retryStartTime = orig.retryStartTime;
}
@Override @Override
public int hashCode() { public int hashCode() {
return (int)attachmentId; return (int)attachmentId;
@ -527,8 +543,24 @@ public class AttachmentDownloadService extends Service implements Runnable {
} }
private void cancelDownload(DownloadRequest req) { private void cancelDownload(DownloadRequest req) {
mDownloadsInProgress.remove(req.attachmentId); LogUtils.d(TAG, "cancelDownload #%d", req.attachmentId);
req.inProgress = false; req.inProgress = false;
mDownloadsInProgress.remove(req.attachmentId);
// Remove the download from our queue, and then decide whether or not to add it back.
remove(req);
req.retryCount++;
if (req.retryCount > CONNECTION_ERROR_MAX_RETRIES) {
LogUtils.d(TAG, "too many failures, giving up");
} else {
LogUtils.d(TAG, "moving to end of queue, will retry");
// The time field of DownloadRequest is final, because it's unsafe to change it
// as long as the DownloadRequest is in the DownloadSet. It's needed for the
// comparator, so changing time would make the request unfindable.
// Instead, we'll create a new DownloadRequest with an updated time.
// This will sort at the end of the set.
req = new DownloadRequest(req, SystemClock.elapsedRealtime());
add(req);
}
} }
/** /**