summaryrefslogtreecommitdiffstats
path: root/src/com/android/providers/downloads/DownloadThread.java
diff options
context:
space:
mode:
authorSteve Howard <showard@google.com>2010-07-15 19:59:40 -0700
committerSteve Howard <showard@google.com>2010-07-19 11:04:38 -0700
commit071bd7acb3185f4f1e807855605c5e6018e9742f (patch)
tree85e1d36689bb632b20b74faaac9596d660a7a46d /src/com/android/providers/downloads/DownloadThread.java
parent1aa26989047495ff58d3e2598d3f9549465cbb65 (diff)
downloadandroid_packages_providers_DownloadProvider-071bd7acb3185f4f1e807855605c5e6018e9742f.tar.gz
android_packages_providers_DownloadProvider-071bd7acb3185f4f1e807855605c5e6018e9742f.tar.bz2
android_packages_providers_DownloadProvider-071bd7acb3185f4f1e807855605c5e6018e9742f.zip
Support for max download size that may go over mobile
This change introduces support for a maximum download size that may go over a mobile connection. Downloads above this limit will wait for a wifi connection. To accomplish this, I moved a lot of the logic for checking connectivity info into DownloadInfo itself. I then moved the code to call these checks from DownloadService, where it would call the checks before spawning a DownloadThread, into DownloadThread itself. This makes it simpler to check connectivity after we get Content-Length info. It also eliminates the risk of a race condition where connectivity changes between the check and the actual request execution. I realize this change reduces efficiency, because we now call into ConnectivityManager/TelephonyManager twice per DownloadThread, rather than once per DownloadService "tick". I feel that it's OK since its a small amount of computation running relatively infrequently. If we feel that it's a serious concern, and that the efficiency issues outweigh the race problem, I can go easily back to the old approach. I've left out the code to actually fetch the limit. I think this will come from system settings, but I want to double-check, so I'll put it in a separate change. Other changes: * simplify SystemFacade's interface to get connectivity info - rather than returning all connected types, just return the active type, since that should be all we care about * adding @LargeTest to PublicApiFunctionalTest Change-Id: Id1faa2c45bf2dade9fe779440721a1d42cbdfcd1
Diffstat (limited to 'src/com/android/providers/downloads/DownloadThread.java')
-rw-r--r--src/com/android/providers/downloads/DownloadThread.java15
1 files changed, 14 insertions, 1 deletions
diff --git a/src/com/android/providers/downloads/DownloadThread.java b/src/com/android/providers/downloads/DownloadThread.java
index e7763e4e..d8271a2b 100644
--- a/src/com/android/providers/downloads/DownloadThread.java
+++ b/src/com/android/providers/downloads/DownloadThread.java
@@ -195,6 +195,12 @@ http_request_loop:
request.addHeader("Range", "bytes=" + bytesSoFar + "-");
}
+ // check connectivity just before sending
+ if (!mInfo.canUseNetwork()) {
+ finalStatus = Downloads.Impl.STATUS_RUNNING_PAUSED;
+ break http_request_loop;
+ }
+
HttpResponse response;
try {
response = client.execute(request);
@@ -437,8 +443,15 @@ http_request_loop:
if (headerContentLength != null) {
contentLength = Integer.parseInt(headerContentLength);
}
+ mInfo.mTotalBytes = contentLength;
values.put(Downloads.Impl.COLUMN_TOTAL_BYTES, contentLength);
mContext.getContentResolver().update(contentUri, values, null, null);
+ // check connectivity again now that we know the total size
+ if (!mInfo.canUseNetwork()) {
+ finalStatus = Downloads.Impl.STATUS_RUNNING_PAUSED;
+ request.abort();
+ break http_request_loop;
+ }
}
InputStream entityStream;
@@ -772,7 +785,7 @@ http_request_loop:
*/
private void notifyThroughIntent() {
Uri uri = Uri.parse(Downloads.Impl.CONTENT_URI + "/" + mInfo.mId);
- mInfo.sendIntentIfRequested(uri, mContext);
+ mInfo.sendIntentIfRequested(uri);
}
/**